Предупреждения на pdfminer
Я нашел и (немного) изменил этот скрипт в stackru, чтобы он работал на python 3.3:
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from io import StringIO
def convert_pdf(path):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
codec = 'utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, laparams=laparams)
fp = open(path, 'rb')
process_pdf(rsrcmgr, device, fp)
fp.close()
device.close()
string = retstr.getvalue()
retstr.close()
return string
print(convert_pdf('abc.pdf'))
Это работает нормально, однако у меня, кажется, есть 2 проблемы:
Во время работы скрипта я получаю массу предупреждений:
ВНИМАНИЕ:root:undefined: PDFCIDFont: basefont='LKOELN+Wingdings-Regular', cidcoding='Adobe-Identity', 139
ВНИМАНИЕ:root:undefined: PDFCIDFont: basefont='LKKPCF+Wingdings2', cidcoding='Adobe-Identity', 132
Который в напечатанном тексте выглядит (cid:139)
Как я могу поймать это предупреждение и заменить этот текст на что-то еще?
Обратите внимание, что у меня есть строка кодека, которая в оригинальном скрипте идет внутри
TextConverter(rsrcmgr, retstr, laparams=laparams)
Однако я получаю:Трассировка (последний вызов был последним): файл "C:/Users/rodrigo/Desktop/csp_pdf/csp_pdf2.py", строка 46, в файле convert_pdf('abc.pdf'), файл "C: / Users / rodrigo / Desktop / csp_pdf /csp_pdf2.py ", строка 33, в convert_pdf device = TextConverter (rsrcmgr, retstr, codec = 'utf-8', laparams = laparams) TypeError: init() получил неожиданный аргумент ключевого слова 'codec'
Это связано с первой проблемой?
Спасибо!
3 ответа
Pdfminer3k, к сожалению, регистрируется в корневом журнале Python. PDFMiner должен правильно реализовать логирование ИМХО. Поэтому невозможно отключить ведение журнала обычным способом, как.
logging.getLogger("pdfminer").setLevel(logging.WARNING)
Вот досада!
Я сделал это, и это работает ™:
logging.propagate = False
logging.getLogger().setLevel(logging.ERROR)
Устанавливает корневой логгер на уровень Error. Это остановит ведение журнала предупреждений PDFMiner, так как он регистрирует в корневом логгере, но не в свою собственную.
Мне нужно было установить распространение на False, потому что после использования PDFMiner у меня были повторяющиеся записи в журнале. Это было вызвано корневым логгером.
Что касается ПРЕДУПРЕЖДЕНИЯ. Если вы посмотрите в файле 'pdfparser.py' часть модуля pdfminer (строка 341) - в моем файле), я считаю, что именно здесь он генерируется. Но прежде чем сделать это, попробуйте этот код ниже. Это для Python 3, и предположим, что вы получили версию для Python 3 - "pdfminer3k 1.3.0", https://pypi.python.org/pypi/pdfminer3k Я получаю предупреждение типа "ПРЕДУПРЕЖДЕНИЕ:root: не удается найти objid=149". ', с кодом ниже, но, похоже, предупреждение не попадает в поток текста. Возможно, файл.pdf поврежден. Примечания к вашему коду В функции 'TextConverter' нет аргумента 'codec' И ваша строка 'TextConverter (rsrcmgr, retstr, laparams=laparams)' верна. Надеюсь, это поможет
import io
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
def convert_pdf(pdfFile, retstr):
password = ''
pagenos = set()
maxpages = 0
laparams = LAParams()
rsrcmgr = PDFResourceManager()
device = TextConverter(rsrcmgr, retstr, laparams=laparams)
process_pdf(rsrcmgr, device, pdfFile, pagenos, maxpages=maxpages, password=password, check_extractable=True)
device.close()
return retstr
pdfFile = open('C:\\SomeDirectory\\Some_PDF_File.pdf','rb')
retstr = io.StringIO()
retstr = convert_pdf(pdfFile, retstr)
print(retstr.getvalue())
pdfFile.close()
Я запускаю pdfMiner на python 3.8, и внутри моего приложения, где я назначил обработчики для корневого регистратора, он очень медленный. После расследования я обнаружил, что каждый модуль создает регистратор с уникальным именем (« ИМЯ »). Не как корневой регистратор. Все они по умолчанию имеют уровень level.DEBUG, а при преобразовании из более ранней версии python2.7 операторы печати были заменены на log. звонки.
Чтобы исправить это, я добавил следующий код сразу после импорта и даже до инициализации классов pdfminer. Это позволяет моему приложению работать достаточно быстро.
# set all pdfminer logging to WARN
pdflogs = [logging.getLogger(name) for name in logging.root.manager.loggerDict if name.startswith('pdfminer')]
for ll in pdflogs:
ll.setLevel(logging.WARNING)