Предупреждения на 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)
Другие вопросы по тегам