Извлечение текста из pdf с помощью pdfminer дает несколько копий
Я пытаюсь извлечь текст из PDF файла с помощью PDFMiner (код, найденный в Извлечение текста из файла PDF с помощью PDFMiner в python?). Я не изменил код, кроме path/to/pdf. Удивительно, что код возвращает несколько копий одного и того же документа. Я получил тот же результат с другими файлами PDF. Нужно ли мне передавать другие аргументы или я что-то упускаю? Любая помощь высоко ценится. На всякий случай, я предоставляю код:
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from cStringIO 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 = file(path, 'rb')
interpreter = PDFPageInterpreter(rsrcmgr, device)
password = ""
maxpages = 0
caching = True
pagenos=set()
fstr = ''
for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
interpreter.process_page(page)
str = retstr.getvalue()
fstr += str
fp.close()
device.close()
retstr.close()
return fstr
print convert_pdf_to_txt("test.pdf")
Ответы
Ответ 1
Мой ответ был немного неправильным в потоке, на который вы ссылаетесь. Я нашел ошибку и забыл обновить свой ответ.
Поскольку документация довольно разрежена с помощью pdfminer, я не могу полностью объяснить, почему это работает так, как это делается. Надеюсь, кто-то, кто знает библиотеку pdfminer немного лучше, может дать нам некоторое представление.
Все, что я знаю, это то, что вам нужно сделать text = retstr.getvalue()
вне цикла for. Я могу только предположить, что retstr
обновляется так, как если бы мы делали final_text += text
внутри цикла for, поэтому, как только все закончится, нам просто нужно сделать text = retstr.getvalue()
, чтобы получить текст со всех страниц.
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from cStringIO 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 = file(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
print convert_pdf_to_txt("test.pdf")
Надеюсь, это помогло!
Ответ 2
Для Python 3 код DuckPuncher нуждается в небольшой корректировке:
import io
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
def convert_pdf_to_txt(path):
rsrcmgr = PDFResourceManager()
retstr = io.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