关于 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 个问题:
虽然 运行 我收到大量警告的脚本:
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 中
设备 = TextConverter(rsrcmgr,retstr,编解码器 = 'utf-8',laparams=laparams)
TypeError: init() 得到了一个意外的关键字参数 'codec'
这与第一期有关吗?
谢谢!
关于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)
我在 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 个问题:
虽然 运行 我收到大量警告的脚本:
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 中 设备 = TextConverter(rsrcmgr,retstr,编解码器 = 'utf-8',laparams=laparams) TypeError: init() 得到了一个意外的关键字参数 'codec'
这与第一期有关吗?
谢谢!
关于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)