Как использовать 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())
Аналогичный вопрос и ответы здесь . Я постараюсь синхронизировать их.