Как найти линии сетки таблицы в файлах PDF?

Чтобы более точно извлекать табличные данные, встроенные в ячейки таблицы, я хотел бы иметь возможность определять границы ячеек таблицы в PDF-файлах следующим образом:

Я пробовал извлекать такие таблицы с помощью Camelot, pdfplumber и PyMuPDF с разной степенью успеха. Но из-за несогласованности получаемых нами PDF-файлов я не могу надежно получить точные результаты даже при указании границ таблицы.

Я считаю, что результаты будут лучше, если я извлечу каждую ячейку таблицы отдельно, явно указав границы ячеек. Я протестировал это, вручную введя границы, которые я получил с помощью инструмента визуальной отладки Camelot.

Моя задача заключается в том, как программно определить границы ячеек таблицы, поскольку таблица может начинаться в любом месте страницы, а ячейки имеют переменную высоту по вертикали.

Мне кажется, это можно было бы сделать, найдя координаты линий-разделителей строк, которые так очевидны визуально человеку. Но я так и не понял, как найти эти строки с помощью инструментов Python. Возможно ли это, или есть другие / лучшие способы решить эту проблему?

1 ответ

Недавно у меня был аналогичный вариант использования, когда мне нужно было определить границы с помощью самого кода. Для вашего варианта использования есть два варианта:

  1. Если вы хотите определить границу всей таблицы, вы можете сделать следующее:
      import pdfplumber
pdf = pdfplumber.open('file_name.pdf')
p0 = pdf.pages[req_page] # go to the required page

tables = p0.debug_tablefinder() # list of tables which pdfplumber identifies
req_table = tables.tables[i] # Suppose you want to use ith table

req_table.bbox # gives you the bounding box of the table (coordinates)
  1. Вы хотите посетить каждую ячейку в таблице и извлечь из них, скажем, слова:
      import pdfplumber
pdf = pdfplumber.open('file_name.pdf')
p0 = pdf.pages[req_page] # go to the required page

tables = p0.debug_tablefinder() # list of tables which pdfplumber identifies
req_table = tables.tables[i] # Suppose you want to use ith table

cells = req_table.cells # gives list of all cells in that table

for cell in cells[i:j]: # iterating through the required cells
    p0.crop(cell).extract_words() # extract the words 
Другие вопросы по тегам