2015-04-21 3 views
2

я нашел и (немного) изменить этот сценарий в StackOverflow для того, чтобы работать на Python 3.3:предупреждения о pdfminer

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 вопроса:

  • Во время работы скрипта я получаю тонны предупреждений:

    ВНИМАНИЕ: корень не определено: PDFCIDFont: BASEFONT = 'LKOELN + Wingdings-Regular', cidcoding = 'Adobe-идентичность', 139
    ВНИМАНИЕ: корень не определено: PDFCIDFont: BASEFONT = 'LKKPCF + Wingdings2', cidcoding = 'Adobe-идентичность', 132

Что в печатном тексте выглядит (cid:139), как я ловлю эти предупреждения и заменить этот текст с чем-то еще?

  • Обратите внимание, что у меня есть кодек линию, которая в оригинальном сценарии идет внутри TextConverter(rsrcmgr, retstr, laparams=laparams), однако я получаю:

    Traceback (самый последний вызов последнего): Файл «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) ТипError: init() получил неожиданное ключевое слово аргумент 'codec'

Это связано с первым выпуском?

Спасибо!

ответ

3

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

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

Bummer!

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

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

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

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

0

Что касается ПРЕДУПРЕЖДЕНИЕ Если посмотреть в файле «pdfparser.py» часть модуля pdfminer (строка 341) - в моем файле) Я считаю, что это, где он генерируется из. Но прежде чем вы это сделаете, попробуйте этот код ниже. Это для Python 3 и предположим, что вы получили версию для python 3 - 'pdfminer3k 1.3.0', https://pypi.python.org/pypi/pdfminer3k Я действительно предупреждаю, как «ПРЕДУПРЕЖДЕНИЕ: корень: не удается найти objid = 149», с кодом ниже, , но предупреждение, похоже, не попадает в текстовый поток. Возможно, файл .pdf поврежден. Заметки о коде В функции 'TextConverter' есть аргумент нет 'кодек' И ваша линия '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() 
Смежные вопросы