Как найти линии сетки таблицы в файлах PDF?
Чтобы более точно извлекать табличные данные, встроенные в ячейки таблицы, я хотел бы иметь возможность определять границы ячеек таблицы в PDF-файлах следующим образом:
Я пробовал извлекать такие таблицы с помощью Camelot, pdfplumber и PyMuPDF с разной степенью успеха. Но из-за несогласованности получаемых нами PDF-файлов я не могу надежно получить точные результаты даже при указании границ таблицы.
Я считаю, что результаты будут лучше, если я извлечу каждую ячейку таблицы отдельно, явно указав границы ячеек. Я протестировал это, вручную введя границы, которые я получил с помощью инструмента визуальной отладки Camelot.
Моя задача заключается в том, как программно определить границы ячеек таблицы, поскольку таблица может начинаться в любом месте страницы, а ячейки имеют переменную высоту по вертикали.
Мне кажется, это можно было бы сделать, найдя координаты линий-разделителей строк, которые так очевидны визуально человеку. Но я так и не понял, как найти эти строки с помощью инструментов Python. Возможно ли это, или есть другие / лучшие способы решить эту проблему?
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)
- Вы хотите посетить каждую ячейку в таблице и извлечь из них, скажем, слова:
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