Работа с таблицами в формате PDF с использованием Python - PullRequest
5 голосов
/ 20 марта 2012

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

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

Ответы [ 4 ]

6 голосов
/ 17 апреля 2012

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

6 голосов
/ 21 марта 2012

Я думаю, что вам нужна библиотека анализатора Python.Наиболее известным является PDFMiner .

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

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

4 голосов
/ 21 марта 2012

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

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

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

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

Удачи!

1 голос
/ 09 ноября 2018

Вы можете использовать Camelot для извлечения табличных данных из вашего PDF и экспорта в ваш любимый формат.В настоящее время;CSV, Excel, JSON и HTML поддерживаются.Вы можете ознакомиться с документацией по адресу: http://camelot -py.readthedocs.io .Было бы полезно, если бы вы могли опубликовать ссылку на свой PDF.Вот пример общего кода:

>>> import camelot
>>> tables = camelot.read_pdf('file.pdf')
>>> type(tables[0].df)
<class 'pandas.core.frame.DataFrame'>
>>> tables[0].to_csv('file.csv')

Отказ от ответственности: я являюсь автором библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...