Проблема в том, что PDFPage.get_pages()
проверяет, является ли текст извлекаемым по соглашению. Вы должны установить флаг check_extractable=False
, чтобы он работал. Кроме того, если PDF-файл, который вы пытаетесь преобразовать в txt, защищен паролем, вы также можете изменить его там. К сожалению, документация PDFPage
не совсем ясна.
password = ""
for page in PDFPage.get_pages(fp, check_extractable=False, password=password):
interpreter.process_page(page)
data = retstr.getvalue()
Весь ваш код будет выглядеть следующим образом:
import io
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfinterp import PDFPageInterpreter, PDFResourceManager
from pdfminer.pdfpage import PDFPage
def pdfparser(data):
rsrcmgr = PDFResourceManager()
retstr = io.StringIO()
codec = 'utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device)
password = ""
maxpages = 0
caching = True
pagenos = set()
with open(data, 'rb') as fp:
for page in PDFPage.get_pages(fp,
pagenos,
maxpages=maxpages,
password=password,
caching=caching,
check_extractable=False):
interpreter.process_page(page)
# As pointed out in another answer, this goes outside the loop
text = retstr.getvalue()
device.close()
retstr.close()
return text
ПРИМЕЧАНИЕ. Реализация шаблона with open ...:
в Python полезна для правильной обработки файловых объектов.