PDFminer 因无法识别的字符而出错

PDFminer errors out over unrecognized character

尝试使用 pdfminer 从 pdf 中提取文本时,出现以下错误:

ValueError: unichr() arg not in range(0x110000) (wide Python build)

似乎有一个无法识别的字符,并且在提取其余文本之前有一个字符抛出错误。 utf 整数大于 110000。大多数此类错误都与狭窄的 Python 构建有关,但在这种情况下不是。

错误似乎在 pdfminer 的 name2unicode 函数中:

<ipython-input-87-ebcd473faf08> in name2unicode(name)
     13     if not m:
     14         raise KeyError(name)
---> 15     return unichr(int(m.group(0)))

我找到了有问题的角色。它的unicode int比范围大很多,我还没找到对应的符号。

pdfminer 函数被设置为跳过键错误,(调用函数正在尝试,除了在键错误之后通过)但是当它是一个超出范围的错误时会错过错误。您可以通过更改原始函数来解决此问题,如下所示:

import re
from pdfminer.psparser import PSLiteral
from pdfminer.glyphlist import glyphname2unicode
from pdfminer.latin_enc import ENCODING
STRIP_NAME = re.compile(r'[0-9]+')
def edit_name2unicode(name):
    """Converts Adobe glyph names to Unicode numbers."""
    if name in glyphname2unicode:
        return glyphname2unicode[name]
    m = STRIP_NAME.search(name)
#     print('name: '+name)
#     print('m: '+str(m))
    if not m or m>110000:
        raise KeyError(name)
    return unichr(int(m.group(0)))

pdfminer.encodingdb.name2unicode = edit_name2unicode

最后请注意,在为整个文档导入pdfminer后,您必须将旧功能设置为新功能。 这是一个运行时解决方法,对于您必须多次完成的过程,我会改为更改源文档,特别是因为 pdfminer 没有很好的 class 结构,您可以轻松继承和覆盖。

但是,如果您想要保留的字符有关键错误,您可以将它们添加到 pypdf glyphlist or add another character set encoding, here