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"