6

我在 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'))

它工作正常,但我似乎有两个问题:

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

    WARNING:root:undefined: PDFCIDFont: basefont='LKOELN+Wingdings-Regular', cidcoding='Adobe-Identity', 139
    WARNING: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 () got an unexpected keyword argument 'codec'

这与第一个问题有关吗?

谢谢!

4

3 回答 3

16

不幸的是,Pdfminer3k 记录到 Python记录器。PDFMiner 应该正确实现日志记录恕我直言。因此,无法以正常方式禁用日志记录。

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

无赖!

我这样做了,它有效™:

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

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

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

于 2015-11-25T21:22:56.313 回答
0

至于警告如果您查看 pdfminer 模块(第 341 行)的文件“pdfparser.py”部分 - 在我的文件中)我相信这是生成它的地方。但在您这样做之前,请尝试下面的代码。这适用于 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()
于 2015-06-20T08:01:26.227 回答
0

我在 python 3.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)
于 2021-04-09T21:31:28.510 回答