У меня была аналогичная проблема недавно, и написал библиотеку, чтобы помочь решить ее: pdfquery.
PDFQuery создает дерево элементов из PDF (используя pdfminer с дополнительным сахаром) и позволяет извлекать элементы со страницы с помощью селекторов JQuery или XPath, основанных главным образом на текстовом содержимом или местоположениях элементов. Таким образом, чтобы разобрать таблицу, вы бы сначала найти, где он находится в документе с помощью функции поиска для метки:
label = pdf.pq(':contains("Name of your table")')
left_corner = float(label.attr('x0'))
bottom_corner = float(label.attr('y0'))
Тогда вы бы держать в поисках линий под столом, пока поиск не вернулся результаты:
page = label.closest('LTPage')
while 1:
row = pdf.extract([
('column_1', ':in_bbox("%s,%s,%s,%s")' % (left_corner+10, bottom_corner+40, left_corner+50, bottom_corner+20)),
('column_2', ':in_bbox("%s,%s,%s,%s")' % (left_corner+50, bottom_corner+40, left_corner+80, bottom_corner+20))
], page)
if not row['column_1'] or row['column_2']:
break
print "Got row:", matches
bottom_corner -= 20
Это предполагает, что ваши строки высоки 20 очков, первый из которых начинается 20 очков ниже этикетки, первый столбец охватывает от 10 до 50 пунктов от левого края этикетки, а второй столбец охватывает от 50 до 80 баллов от левого края этикетки.
Если у вас есть пустые строки или линии с разной высотой, это станет более раздражать.Вам также может потребоваться использовать параметр merge_tags = None для выбора отдельных символов, а не слов, если записи в таблице достаточно близки, чтобы заставить синтаксический анализатор считать, что это всего лишь одна строка. Но, надеюсь, это становится вам ближе ...
Вопрос спрашивает о том, как сделать это в Python. –