Недавно у меня была похожая проблема, и я написал библиотеку, чтобы помочь решить ее: 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 для выбора отдельных символов, а не слов, если записи в таблице достаточно близки, чтобы заставить анализатор думать, что это всего лишь одна строка. Но, надеюсь, это сблизит вас ...