在Python中使用pdfminer处理连字

3 投票
1 回答
1879 浏览
提问于 2025-04-18 07:03

我有一个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

这个方法看起来很有效,因为当我打印这个字符串时,文本能够正常显示。不过,仔细一看,发现有一些字符组合(比如"ff"、"fi"、"fl"和"ff")在生成的文本中变成了"! "。

经过一些研究,我发现这些字符组合都有“连字”,意思是它们可以用两个字符合并成一个新的字符来表示。

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

我开始尝试不同的字符编码,想把文本中的"! "变成正确的连字,但到现在为止还没有成功。

这可能和我的PDF文件或者PDFminer本身有关?

1 个回答

6

我给PDFMiner的创始人Yusuke Shinyama发了邮件,下面是他回复的总结。

  • 这个PDF使用了特殊的字体来处理连字。
  • 像“fi”、“ff”或“fl”这样的字母在英语排版中有时会被特别处理,通常会把它们合并成一个字形,这样看起来更美观。
  • 这个PDF就是这样做的,它用“! ”来表示合并后的字母,可能在用那种特殊字体显示时看起来像“fi”或“ff”。
  • 因为PDFMiner没有这些信息,它总是试图提取文档中的字面文本。

根据Shinyama博士的说法,除了可能使用OCR软件之外,没有好的解决办法。


我没有时间去实现OCR,所以我写了一个非常简单的拼写检查器。这个拼写检查器会扫描我的文本,找到带有“! ”的单词(使用正则表达式),然后把它们和一个包含连字的已知单词列表进行比较。

根据Shinyama博士的说法,世界上还有很多这样的PDF,把PDF转换成文本总是只能得到一个“尽力而为”的结果。

撰写回答