Tabula-py пропускает первую страницу из PDF и пропускает некоторые табличные данные - PullRequest
0 голосов
/ 27 марта 2020

Я использую Python (3.8.1) и tabula-py (2.1.0) (https://tabula-py.readthedocs.io/en/latest/tabula.html#tabula .io.build_options ) для извлечения таблиц из текстового PDF-файла (ежемесячно *) 1028 * отчет по оплате).

Ниже показан образец файла PDF (внизу 1-й страницы и верх 2-й страницы).

PDF sample


Сценарий Python показан ниже:

from tabula import read_pdf
from tabulate import tabulate

df = read_pdf(
   "my_report.pdf",
   output_format="dataframe",
   multiple_tables=True,
   pages="all",
   silent=True,
   # TODO: area = (x_left, x_right, y_left, y_right) # ?
)

print(tabulate(df))


, который генерирует следующий вывод:

---  ---------------------------------------------------------------------------  ---------------------  ---------
  0  region                                                                       nan                    nan
  1  AWS CloudTrail APS2-PaidEventsRecorded                                       nan                    $3.70
  2  0.00002 per paid event recorded in Asia Pacific (Sydney)                     184,961.000 Events     $3.70
  3  region                                                                       nan                    nan
  4  Asia Pacific (Tokyo)                                                         nan                    $3.20

Я думаю, что параметр области должен быть правильно установлен, поскольку верхние и левые данные иногда опускаются. Так ли это, и если да, то как найти правильную область всех табличных данных в файле PDF?

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

1 Ответ

0 голосов
/ 27 марта 2020

Мне удалось решить эту проблему, расширив местоположение искомых данных:

# get locations from page 2 data:
tables = read_pdf("my_report.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
# Expand location borders slightly:
test_area = [top - 20, left - 20, bottom + 10, right + 10]

# Now read_pdf gives all data with the following call:

df = read_pdf(
   "my_report.pdf",
   multiple_tables=True,
   pages="all",
   silent=True,
   area = test_area
)
...