我正在使用PDFMiner将.pdf文件转换为.xml文件。
对于.pdf文件中的每个单词,PDFMiner都会检查它是否为Unicode(以及其他许多东西)。如果是,它将返回字符,如果不是,它将引发异常并返回字符串“(cid:%d)”,其中%d是字符ID,我认为这是Unicode十进制。
此问题的编辑部分对此进行了很好的解释:What is this (cid:51) in the output of pdf2txt?。为了方便起见,我在这里报告代码:
def render_char(self, matrix, font, fontsize, scaling, rise, cid):
try:
text = font.to_unichr(cid)
assert isinstance(text, unicode), text
except PDFUnicodeNotDefined:
text = self.handle_undefined_char(font, cid)
def handle_undefined_char(self, font, cid):
if self.debug:
print >>sys.stderr, 'undefined: %r, %r' % (font, cid)
return '(cid:%d)' % cid
通常,对于以西里尔字母编写的.pdf文件,我会获得此例外。但是,有一个文件使用普通英语,对于不间断空格(cid = 160),我会收到此异常。我不明白为什么这个字符不能被识别为Unicode,而同一文件中的所有其他字符却不能被识别为Unicode。
如果在相同的环境下,我在控制台中运行isinstance(u'160', unicode)
,则得到True
,而当它在PDFMiner中运行时,(显然)等效的命令将返回False
。
如果调试,我会正确识别字体,即得到:
cid = 160
font = <PDFType1Font: basefont='Helvetica'>
PDFMiner接受编解码器作为参数。我选择了utf-8,它具有160作为不间断空格(http://dev.networkerror.org/utf8/)的Unicode十进制。
如果可能有帮助,这是to_unichr的代码:
def to_unichr(self, cid): if self.unicode_map: try: return self.unicode_map.get_unichr(cid) except KeyError: pass try: return self.cid2unicode[cid] except KeyError: raise PDFUnicodeNotDefined(None, cid)
是否可以设置/更改代码识别的字符映射?
您认为我应该更改什么,或者您认为应该在哪里进行调查,以使cid = 160不会引发异常?
我正在使用PDFMiner将.pdf文件转换为.xml文件。对于.pdf文件中的每个单词,PDFMiner都会检查它是否为Unicode(以及其他许多东西)。如果是,则返回字符,...
示例文档中有问题的字体是简单字体,并使用WinAnsiEncoding
对于那些遇到上述错误的人,下面的代码可能会帮助您。