Как использовать PDFminer.six с Python 3?

Я хочу использовать pdfminer.six для Python 3 для извлечения pdf. Проблема в том, что нет хорошей документации и нет примера исходного кода о том, как его использовать.

Я уже пробовал некоторый код из Stackru, но он не работал. Мой код, как показано ниже.

from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO

def convert_pdf_to_txt(path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = open(path, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos=set()

    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
        interpreter.process_page(page)

    text = retstr.getvalue()

    fp.close()
    device.close()
    retstr.close()
    return text

Мне нужен пример кода о том, как использовать это для получения данных из PDF-файлов.

2 ответа

Решение

Установить pdfminer.six или pdfminer3 ( https://github.com/gwk/pdfminer3/) установить: pip install pdfminer3 Я перешел на pdfminer3, когда обновился до 3.7 с 3.6 Я использую на Ubuntu и MacOS с Python 3.7.3

pdfminer3 поставляется с двумя удобными инструментами: pdf2txt.py и dumppdf.py для изучения источника. Довольно маленький и легкий для понимания.

Ниже приведен рабочий пример (после добавления местоположения файла PDF)

from pdfminer3.layout import LAParams, LTTextBox
from pdfminer3.pdfpage import PDFPage
from pdfminer3.pdfinterp import PDFResourceManager
from pdfminer3.pdfinterp import PDFPageInterpreter
from pdfminer3.converter import PDFPageAggregator

resource_manager = PDFResourceManager()
fake_file_handle = io.StringIO()
converter = TextConverter(resource_manager, fake_file_handle)
page_interpreter = PDFPageInterpreter(resource_manager, converter)

with open('/path/to/file.pdf', 'rb') as fh:

    for page in PDFPage.get_pages(fh,
                                  caching=True,
                                  check_extractable=True):
        page_interpreter.process_page(page)

    text = fake_file_handle.getvalue()

# close open handles
converter.close()
fake_file_handle.close()

print(text)

Полное раскрытие, я являюсь одним из сопровождающих pdfminer.six. Это поддерживаемая сообществом версия pdfminer для Python 3.

В настоящее время у него есть несколько API для извлечения текста из PDF, в зависимости от ваших потребностей. За кулисами все эти API используют одну и ту же логику для разбора и анализа макета.

(Все примеры предполагают, что ваш PDF-файл называется example.pdf)

Командная строка

Если вы хотите извлечь текст только один раз, вы можете использовать инструмент командной строки pdf2txt.py:

      $ pdf2txt.py example.pdf

API высокого уровня

Если вы хотите извлечь текст (свойства) с помощью Python, вы можете использовать API высокого уровня. Этот подход является идеальным решением, если вы хотите программно извлечь информацию из PDF.

      from pdfminer.high_level import extract_text

# Extract text from a pdf.
text = extract_text('example.pdf')

# Extract iterable of LTPage objects.
pages = extract_pages('example.pdf')

Составной API

Существует также компонуемый API, который дает большую гибкость в обработке результирующих объектов. Например, он позволяет создать собственный алгоритм компоновки. Этот метод предлагается в других ответах, но я бы рекомендовал его только тогда, когда вам нужно настроить какой-либо компонент.

      from io import StringIO

from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfparser import PDFParser

output_string = StringIO()
with open('example.pdf', 'rb') as in_file:
    parser = PDFParser(in_file)
    doc = PDFDocument(parser)
    rsrcmgr = PDFResourceManager()
    device = TextConverter(rsrcmgr, output_string, laparams=LAParams())
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    for page in PDFPage.create_pages(doc):
        interpreter.process_page(page)

print(output_string.getvalue())

Аналогичный вопрос и ответы здесь . Я постараюсь синхронизировать их.

Другие вопросы по тегам