【问题标题】:Dealing with ligatures using pdfminer in python在 python 中使用 pdfminer 处理连字
【发布时间】:2026-01-26 01:15:01
【问题描述】:

我有一个 Python 脚本,它使用 PDFminer 从 pdf 文档中读取文本,如下所示:

def convert_pdf_to_txt(path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    file_pointer = file(path, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos=set()
    for page in PDFPage.get_pages(file_pointer, pagenos, maxpages=maxpages, password=password, caching=caching, check_extractable=True):
        interpreter.process_page(page)
    file_pointer.close()
    device.close()
    str = retstr.getvalue()
    retstr.close()
    return str

这似乎工作得很好,因为在打印这个字符串 str 时会显示文本。然而,仔细观察后,在查看生成的文本时,会发现许多双字符(即“ff”、“fi”、“fl”和“ff”)会变成“!”。

经过一些研究,我发现这些字符都有“连字”,这意味着它们可以替换为两个字符的连接版本。

这些连字显然无法在 ASCII 中找到,但我发现它们可以通过 unicode 表示。

我开始尝试不同的字符编码,以使我的文本中的“!”变成正确的连字,但我没有成功。

也许这与我的 PDF 文件或 PDFminer 本身有关?

【问题讨论】:

    标签: python unicode encoding utf-8 pdfminer


    【解决方案1】:

    所以我最终向 PDFMiner 的创建者 Yusuke Shinyama 发送了电子邮件。我在下面总结了他的回复。

    • 有问题的 PDF 使用特殊字体进行连字。
    • “fi”“ff”或“fl”之类的字母有时在英文版式中会被特殊处理,并且它们通常组合成一个字形以使其看起来更好。
    • 有问题的 PDF 正是这样做的,并使用“!”作为组合字母,当使用该专用字体呈现时,它可能看起来像“fi”或“ff”。
    • 由于 PDFMiner 没有该信息,它总是尝试提取 文档中的文字。

    根据 Shinyama 博士的说法,没有好的解决方案,除了可能将所有内容都放到 OCR 软件中。


    我没有时间实现 OCR,因此我编写了一个非常简单的拼写检查器。拼写检查器会遍历我的文本,查找带有“!”的单词(使用正则表达式),然后将它们与包含连字的已知单词列表进行比较。

    根据 Shinyamas 博士的说法,世界上仍然有很多这样的 PDF,将 PDF 转换为文本总是以“尽力而为”的结果结束。

    【讨论】:

    • 语言真的很棒。感谢您提供这个非常有见地的答案!当然,作为一名计算机科学家,这让我在内心尖叫,但作为一个人类,它让我停下来考虑既是 unicode 标准又是更大的互联网的不拘一格的文化融合。