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-bit).

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

Большое спасибо заранее!

1 ответ

Это может быть связано с тем, что область ваших данных в файле 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.

Попробуй использовать java_options лайк:java_options="-Xmx4g"

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