PDFMiner - экспорт страниц в виде списка строк

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

До сих пор я получил код для извлечения полного PDF в виде строки, но он мне нужен в виде списка строк.

мой код выглядит следующим образом

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from cStringIO import StringIO

f = file('./PDF/' + file_name, 'rb')
data = []
rsrcmgr = PDFResourceManager()
retstr = StringIO()
codec = 'utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
# Create a PDF interpreter object.
interpreter = PDFPageInterpreter(rsrcmgr, device)
# Process each page contained in the document.

for page in PDFPage.get_pages(pdf):
    interpreter.process_page(page)
    data = retstr.getvalue()

print data

Помогите, пожалуйста.

1 ответ

Решение

Проблема с вашим текущим скриптом StringIO.getvalue всегда возвращает строку, и эта строка содержит все прочитанные данные. Более того, с каждой страницей вы перезаписываете переменную data где вы храните это.

Одним из исправлений является сохранение позиции StringIO перед записью, а затем с этой позиции до конца потока строки:

# A list for all each page's text
pages_text = []

for page in PDFPage.get_pages(pdf):
    # Get (and store) the "cursor" position of stream before reading from PDF
    # On the first page, this will be zero
    read_position = retstr.tell()

    # Read PDF page, write text into stream
    interpreter.process_page(page)

    # Move the "cursor" to the position stored
    retstr.seek(read_position, 0)

    # Read the text (from the "cursor" to the end)
    page_text = retstr.read()

    # Add this page's text to a convenient list
    pages_text.append(page_text)

Думать о StringIO как текстовый документ. Вам необходимо управлять позицией курсора при добавлении текста и сохранять вновь добавленный текст по одной странице за раз. Здесь мы храним текст в списке.

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