Предупреждения о pdfminer

Я нашел и (слегка) изменил этот скрипт в stackoverflow, чтобы он работал на 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 -Идентичность», 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 '

Это связано с первой проблемой?

Спасибо!


person rodrigocf    schedule 21.04.2015    source источник


Ответы (3)


К сожалению, Pdfminer3k ведет журнал в root регистраторе Python. PDFMiner должен правильно вести журнал IMHO. Таким образом, невозможно отключить ведение журнала обычным способом, например.

logging.getLogger("pdfminer").setLevel(logging.WARNING)

Облом!

Я сделал это, и это работает ™:

    logging.propagate = False 
    logging.getLogger().setLevel(logging.ERROR)

Он устанавливает корневой регистратор на уровень Error. Это остановит ведение журнала предупреждений PDFMiner, поскольку он регистрируется в корневом регистраторе, а не в вашем собственном журнале.

Мне нужно было установить для распространения значение False, потому что после использования PDFMiner у меня были повторяющиеся записи в журнале. Это было вызвано корневым регистратором.

person Pullie    schedule 25.11.2015
comment
Просто logging.getLogger('pdfminer').setLevel(logging.ERROR) теперь работает? - person jtlz2; 04.06.2018

Что касается ПРЕДУПРЕЖДЕНИЯ. Если вы посмотрите в файле «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()
person John Smith    schedule 20.06.2015

Я запускаю pdfMiner на python 3.8, и внутри моего приложения, где я назначил обработчики для корневого регистратора, он работает очень медленно. После расследования я обнаружил, что каждый модуль создает регистратор с уникальным именем ('NAME'). Не как корневой регистратор. Все они по умолчанию имеют уровень 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)
person Max Slimmer    schedule 09.04.2021