我有一个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 本身有关?
所以我最终给 PDFMiner 的创建者 Yusuke Shinyama 发了电子邮件。我把他的回复总结如下。
根据 Shinyama 博士的说法,除了将所有内容都放入 OCR 软件之外,没有好的解决方案。
我没有时间实现 OCR,因此我编写了一个非常简单的拼写检查器。拼写检查器会遍历我的文本,查找带有“!”的单词(使用正则表达式),然后将它们与具有连字的已知单词列表进行比较。
根据 Shinyamas 博士的说法,世界上仍然有很多这样的 PDF,将 PDF 转换为文本总是会得到“尽力而为”的结果。