关于 pdfminer 的警告

Warnings on pdfminer

我在 Whosebug 中找到并(略微)修改了这个脚本,使其适用于 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 个问题:

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

这与第一期有关吗?

谢谢!

关于WARNING 如果您查看 pdfminer 模块的文件 'pdfparser.py' 部分(第 341 行)——在我的文件中) 我相信这是它产生的地方。 但在你这样做之前,请尝试下面的代码。这是针对 Python 3 的,假设你得到了 python 3 的版本 - 'pdfminer3k 1.3.0'、https://pypi.python.org/pypi/pdfminer3k 我确实收到类似 'WARNING:root:Cannot locate 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()
不幸的是,

Pdfminer3k 记录到 Python root 记录器。 PDFMiner 应该正确实施日志记录恕我直言。所以不可能以正常方式禁用日志记录。

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

糟透了!

我这样做了并且有效™:

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

它将根记录器设置为错误级别。这将停止 PDFMiner 警告日志记录,因为它记录到根记录器,而不是您自己的日志记录。

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

我在 python 3.8 上 运行ning pdfMiner 并且在我的应用程序内部我已将处理程序分配给根记录器,它非常慢。经过调查,我发现每个模块都会创建一个具有唯一名称('NAME')的记录器。不是作为根记录器。所有这些都默认为 level.DEBUG 并且从早期的 python2.7 版本打印语句转换为日志。来电。

为了解决这个问题,我在导入之后甚至在初始化 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)