Python pdfminer上的警告

Python pdfminer上的警告,python,pdf,python-3.x,pdfminer,Python,Pdf,Python 3.x,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): rs

我在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'))
它工作正常,但我似乎有两个问题:

  • 运行脚本时,我收到大量警告:

    警告:root:未定义:PDFCIDFont:basefont='LKOELN+Wingdings Regular',cidcoding='Adobe-Identity',139
    警告:root:未定义:PDFCIDFont:basefont='LKKPCF+Wingdings2',cidcodeding='Adobe-Identity',132

打印文本中的哪个看起来像
(cid:139)
,如何捕获此警告并用其他内容替换该文本

  • 请注意,我有一个编解码器行,它在原始脚本中位于
    TextConverter(rsrcmgr,retstr,laparams=laparams)
    中,但是我得到:

    回溯(最近一次呼叫最后一次): 文件“C:/Users/rodrigo/Desktop/csp_pdf/csp_pdf2.py”,第46行,在 转换为pdf(“abc.pdf”) 文件“C:/Users/rodrigo/Desktop/csp_pdf/csp_pdf2.py”,第33行,转换为pdf格式 设备=文本转换器(rsrcmgr、RETSR、编解码器='utf-8',laparams=laparams) TypeError:init()获得意外的关键字参数“codec”

这与第一个问题有关吗

谢谢

关于警告 如果查看pdfminer模块(第341行)的文件“pdfparser.py”部分-在我的文件中) 我相信这就是它产生的原因。 但在您这样做之前,请尝试下面的代码。这是针对Python3的,假设您得到了 python 3版本-“pdfminer3k 1.3.0”, 我确实收到类似“warning:root:cannotlocateobjid=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()

Pdfminer3k将日志记录到Pythonroot记录器。PDFMiner应在IMHO中正确执行日志记录。因此,不可能像这样以正常方式禁用日志记录

logging.getLogger("pdfminer").setLevel(logging.WARNING)
真倒霉

我这样做了,它的工作™:

    logging.propagate = False 
    logging.getLogger().setLevel(logging.ERROR)
它将根记录器设置为级别错误。这将停止PDFMiner警告日志记录,因为它记录到根日志记录程序,而不是您自己的日志记录


我需要将传播设置为False,因为在使用PDFMiner之后,我有重复的日志条目。这是由根记录器造成的。

我在Python3.8上运行pdfMiner,在我的应用程序中,我已经为根记录器分配了处理程序,速度非常慢。经过调查,我发现每个模块都创建了一个具有唯一名称(“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)
只是
logging.getLogger('pdfminer').setLevel(logging.ERROR)
现在似乎可以工作了?