Tabula-py пропускает первую страницу из PDF и пропускает некоторые табличные данные

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

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

Образец PDF


Сценарий 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?

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


person Gustav Rasmussen    schedule 27.03.2020    source источник
comment
PostScript — это язык верстки. Он практически не сохраняет структуру исходного документа (разделы, главы и т. д.). Так что идентификация таблиц в PDF — это скорее искусство, чем наука. В PostScript нет тега table. tabula-py необходимо сделать вывод о существовании таблицы просто из макета. И нет простого способа узнать из PDF, что таблица на странице 2 является продолжением таблицы на странице 1, если только она не имеет повторяющихся заголовков. Возможно, вы могли бы сообщить об этом как о проблеме на github.com/chezou/tabula-py/issues .   -  person BoarGules    schedule 27.03.2020
comment
@BoarGules Хороший вопрос. Я сообщу по этому вопросу. Есть ли у вас какие-либо предложения по лучшему решению для извлечения табличных данных из этого PDF-файла в какой-либо фрейм данных, формат CSV или аналогичный?   -  person Gustav Rasmussen    schedule 27.03.2020


Ответы (2)


Попробуйте использовать параметр Guess=False.

person John Smith    schedule 21.09.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
)
person Gustav Rasmussen    schedule 27.03.2020
comment
Меня удивило, что это сработало, так как документация для tabula-py (tabula-py.readthedocs.io/en/latest/) указывает, что по умолчанию выполняется поиск по всей странице PDF. - person Gustav Rasmussen; 27.03.2020