PDF文本提取与字符编码问题解决方案

在使用Foxit Reader阅读器时,可能会遇到无法从文档中复制文本的情况。复制到剪贴板的只有乱码字符,而不是可读文本。这种情况通常不是由于PDF文件的复制/打印限制造成的,因为如果存在这样的限制,甚至无法复制任何文本。这种限制通常可以通过多种PDF解锁工具或使用Evince这样的阅读器来轻松移除,Evince不遵守这些权限设置,允许用户执行所有操作。

在案例中,当选择文本并右键点击时,"复制"选项清晰可见。但是,切换到Foxit Reader的"文本查看器"模式后,发现PDF文件中的所有文本可能已经被编码,或者至少是使用自定义字符集存储的,因为找不到任何可读文本。

为了进一步调查这个问题,下载并使用了PDFStreamDumper工具来查看PDF文件中嵌入的字符集。不出所料,PDFStreamDumper也无法检索到任何可读文本,只显示了乱码字符。

通过浏览PDF文件中的流,找到了一个似乎负责自定义字符编码的流。看起来PDF文件并不是使用标准的字符编码(如Unicode或ANSI)生成的。相反,作者决定使用CID字体,这是Adobe的自定义字体和字符集格式,来存储文档文本。虽然使用CID字体在显示东方语言文本时有很多优势,但在这种情况下,认为这纯粹是为了使从文档中复制文本变得麻烦,因为大多数阅读器应用程序只会复制原始编码的字符,导致粘贴时出现乱码。

恢复原始文本

那么,如何从这样的文档中复制文本呢?第一种明显的方法是研究使用的CID字体(可以在这里阅读一些提示),比较解码后的文本和存储的字符,逆向工程映射规则,并编写程序根据规则从PDF文件中恢复原始文本。对于普通计算机用户来说,这并不是一个简单的任务。

另一种可能的方法是使用窗口文本捕获工具,如TextCatch,它试图从选定的窗口中抓取显示的文本。然而,对于测试的大多数PDF文件,即使是那些没有特殊字符编码的PDF文件,TextCatch似乎也无法从PDF查看器窗口中检索到任何文本。

有没有更简单的方法呢?如何对PDF文件进行光学字符识别(OCR)呢?在Adobe Acrobat中,可以通过"视图">"工具">"文本识别"菜单来执行这个操作。但是,结果并不理想,因为存储的文本虽然被编码,但仍然可以被Adobe Acrobat渲染,Adobe Acrobat拒绝工作,除非页面是图像,可以进行OCR。

尝试使用Foxit Reader的PDF打印机将文档打印到另一个PDF文件中。这样,生成的文件将每页存储为图像,并移除了自定义字符编码。结果,Adobe Acrobat的OCR现在可以正常工作了。

如果Adobe Acrobat仍然说文件包含可渲染的文本,请将打印的文档作为另一个PDF文件打印,并再次尝试,这将确保任何剩余的文本也被转换为图形。

保存生成的文件并用Foxit Reader打开后,可以看到文档现在包含可读文本。PDF中的文本现在可以无问题地搜索了。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485