Tabula-py опускает страницы из PDF-документа, который я пытаюсь извлечь

Я пытаюсь извлечь таблицы из многостраничного 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, а не Табулы - может ли файл быть ошибочно установлен как защищенный или заблокированный, и знает ли кто-нибудь из вас, как я могу проверить это и открыть его?

Заранее спасибо!

361 страница таблицы (ов)? Возможно, у вас заканчивается память?

Yohst 30.07.2018 02:01

Спасибо за комментарий @Yohst! Я не думаю, что здесь проблема с памятью. Первая страница 361-страничного документа была опущена, и попытался использовать тот же код только на этой странице (как одностраничный документ). Когда я попытался распечатать фрейм данных, я только что получил текст ответа «Нет», поэтому я думаю, что Tabula-py не работает на этой странице, как и некоторые другие страницы, которые были пропущены. Не могли бы вы что-нибудь посоветовать, @Yohst?

Sannita 30.07.2018 02:30

Я попытался запустить вашу настройку, но получил ошибку Java в read_pdf (). Я так понимаю, tabula запускает java в фоновом режиме и может потребовать определенной конфигурации. Я использую macOS, поэтому не хочу с этим связываться. Может, пора связаться с авторами библиотеки?

Yohst 30.07.2018 08:28

Спасибо, что посмотрели еще раз, @Yohst! Я тоже пробовал переустановить java, но у меня уже была последняя версия. Автор библиотеки @chezou попросил направлять ему все вопросы через Stack Overflow, но у меня, похоже, нет способа уведомить его о моем вопросе, поэтому я просто надеюсь, что он это когда-нибудь увидит.

Sannita 30.07.2018 11:57
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
4
2 341
2

Ответы 2

Попробуйте использовать 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.

Другие вопросы по теме