为什么在PDFMiner中字符ID 160不被识别为Unicode?

问题描述 投票:1回答:2

我正在使用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(以及其他许多东西)。如果是,则返回字符,...

python pdf utf-8 python-unicode pdfminer
2个回答
1
投票

示例文档中有问题的字体是简单字体,并使用WinAnsiEncoding


-1
投票

对于那些遇到上述错误的人,下面的代码可能会帮助您。

© www.soinside.com 2019 - 2024. All rights reserved.