Я пытаюсь извлечь таблицы из многостраничного PDF-файла с помощью tabula-py, и хотя таблицы на некоторых страницах PDF-файла извлекаются отлично, некоторые страницы полностью опущены.
Пропуски кажутся случайными и не следуют за какими-либо видимыми визуальными элементами в PDF (поскольку каждая страница выглядит одинаково), поэтому в таблице пропущена страница 1, извлеченная страница 2, пропущенные страницы 3 и 4, извлеченная страница 5, пропущенная страница 6, извлечены страницы 8 и 9, пропущено 10, извлечено 11 и т. д. У меня есть macOS Sierra 10.12.6 и Python 3.6.3 :: Anaconda custom (64-разрядная версия).
Я пробовал разбивать PDF-файл на более короткие разделы, даже на одностраничные, но пропущенные страницы, похоже, невозможно извлечь, что бы я ни пробовал. Я прочитал соответствующую документацию и зарегистрировал проблемы на странице Tabula-py GitHub, а также здесь, в Stack Overflow, но, похоже, не нашел решения.
Код, который я использую в записных книжках iPython, выглядит следующим образом:
Чтобы установить tabula через терминал:
pip install tabula-py
Чтобы извлечь таблицы из моего PDF-файла:
from tabula import read_pdf
df = read_pdf("document_name.pdf", pages = "all")
Я также пробовал следующее, что не имело никакого значения
df = read_pdf("document_name", pages = "1-361")
Чтобы сохранить фрейм данных в csv:
df.to_csv('document_name.csv')
Я был бы действительно благодарен, если бы вы могли мне с этим помочь, так как я чувствую, что застрял с PDF-файлом, из которого мне удалось извлечь только около 50% данных. Это бесит, поскольку 50% выглядят абсолютно идеально, но остальные 50% кажутся мне недоступными и делают невозможным более масштабный проект по анализу данных.
Мне также интересно, может ли это быть проблемой PDF, а не Табулы - может ли файл быть ошибочно установлен как защищенный или заблокированный, и знает ли кто-нибудь из вас, как я могу проверить это и открыть его?
Заранее спасибо!
Спасибо за комментарий @Yohst! Я не думаю, что здесь проблема с памятью. Первая страница 361-страничного документа была опущена, и попытался использовать тот же код только на этой странице (как одностраничный документ). Когда я попытался распечатать фрейм данных, я только что получил текст ответа «Нет», поэтому я думаю, что Tabula-py не работает на этой странице, как и некоторые другие страницы, которые были пропущены. Не могли бы вы что-нибудь посоветовать, @Yohst?
Я попытался запустить вашу настройку, но получил ошибку Java в read_pdf (). Я так понимаю, tabula запускает java в фоновом режиме и может потребовать определенной конфигурации. Я использую macOS, поэтому не хочу с этим связываться. Может, пора связаться с авторами библиотеки?
Спасибо, что посмотрели еще раз, @Yohst! Я тоже пробовал переустановить java, но у меня уже была последняя версия. Автор библиотеки @chezou попросил направлять ему все вопросы через Stack Overflow, но у меня, похоже, нет способа уведомить его о моем вопросе, поэтому я просто надеюсь, что он это когда-нибудь увидит.
Попробуйте использовать java_options
как:
java_options = "-Xmx4g"
Это может быть связано с тем, что область ваших данных в файле PDF превышает область, читаемую таблицей. Попробуйте следующее:
Сначала получите местоположение ваших данных, проанализировав одну из страниц в формате JSON (здесь я выбрал страницу 2), затем извлеките и распечатайте местоположения:
tables = read_pdf("document_name.pdf", output_format = "json", pages=2, silent=True)
top = tables[0]["top"]
left = tables[0]["left"]
bottom = tables[0]["height"] + top
right = tables[0]["width"] + left
print(f"{top=}\n{bottom=}\n{left=}\n{right=}")
Теперь вы можете попробовать немного расширить эти местоположения экспериментально, пока не получите больше данных из PDF-документа:
# area = [top, left, bottom, right]
# Example from page 2 json output: area = [30.0, 59.0, 761.0, 491.0]
# You could then nudge these locations slightly to include a wider data area:
test_area = [10.0, 30.0, 770.0, 500.0]
df = read_pdf(
"document_name.pdf",
multiple_tables=True,
pages = "all",
area=test_area,
silent=True, # Suppress all stderr output
)
а переменная df теперь будет содержать ваши таблицы с данными PDF.
361 страница таблицы (ов)? Возможно, у вас заканчивается память?