2012-03-20 1 views
4

Я работаю над файлом PDF. В этом pdf-файле содержится несколько таблиц.
В соответствии с именами таблиц, приведенными в pdf, я хотел получить данные из этой таблицы с помощью python.Работа с таблицами в pdf с использованием python

Я работал над обработкой html, xlm, но никогда с pdf.
Может ли кто-нибудь сказать мне, как получать таблицы из pdf с помощью python?

ответ

5

Я думаю, что вам нужна библиотека парсеров python. Самый известный - PDFMiner.

Согласно документации:

PDFMiner является инструментом для извлечения информации из PDF-документов. В отличие от других инструментов, связанных с PDF, он полностью фокусируется на получении и анализе текстовых данных. PDFMiner позволяет получить точное местоположение текста на странице, а также другую информацию, такую ​​как шрифты или строки. Он включает в себя PDF-конвертер, который может преобразовывать PDF-файлы в другие текстовые форматы (например, HTML). Он имеет расширяемый анализатор PDF, который может использоваться для других целей, кроме текстового анализа.

3

Это очень сложная проблема и не разрешима вообще.

Причина в том, что формат PDF слишком гибкий. Некоторые PDF-файлы - это только растровые изображения (вам придется делать свой собственный OCR, а затем, очевидно, не нашу тему здесь), некоторые из них представляют собой кучу букв, буквально пролитых на страницы; это означает, что путем разбора текстовой информации в PDF вы можете получить отдельные символы, помещенные в некоторые координаты. В некоторых случаях это происходит упорядоченным образом (по строкам слева направо), но в некоторых случаях вы получите скорее случайные распределения, чаще всего с иными, а также специальные символы, символы другого шрифта и т. Д. может выйти из строя.

Единственный правильный подход - разместить все символы в соответствии с их координатами на модели страниц, а затем использовать эвристику, чтобы узнать, что такое линии.

Предлагаю ознакомиться с вашими PDF-файлами и таблицами, которые вы хотите проанализировать перед запуском. Возможно, они все время одинаковы и хорошо разбираются.

Удачи вам!

5

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

 Смежные вопросы

  • Нет связанных вопросов^_^