我编写了一个 bash 脚本,用于从扫描的 PDF 文件中提取纯文本。我有很多 PDF,但有些是扫描的,有些不是。所以现在我的主要目标是通过检查 PDF 是否已经可搜索来改进我的脚本,这样就不需要 OCR 提取。
我已经尝试过:
pdftext -nopgbrk pdf_file.pdf 单词列表
将可能的 OCR 文本存储在 wordlist
中,这样我就可以检查它是否为空并确定它是否是可搜索的 PDF。
我还尝试过 pdffonts pdf_file.pdf
来检查该 PDF 中是否有字体,以及其中是否有文本。
这两种方法都工作得很好,但在某些情况下会失败。
例如,我需要 OCR 的一些 PDF 是经过数字签名的,并且这些签名总是会向 PDF 添加文本层。因此,当我运行这两个命令中的任何一个时,它将输出签名的文本或其正在使用的字体。就好像它仅仅因为签名就找到了纯文本一样。它可能只是带有数字签名的扫描 PDF,但会被检测为纯文本 PDF。
数字签名始终以这种方式添加文本(使用 Helvetica 字体):
签名人:姓名
日期:中欧夏令时日期
公司:公司名称
所以:
pdftext -nopgbrk pdf_file.pdf 单词列表 | grep -v -E '签名|日期|公司'
我可以设法删除这些线条,因此如果它确实是扫描的 PDF,则输出将为空。
它对某些 PDF 有效,直到我注意到有其他格式的签名,所以我觉得这只是一种解决方法,而不是一个很好的解决方案。
有什么方法可以检查 PDF 是否完全可搜索?我只需要一种提取 PDF 文本但省略数字签名的方法。另外,grep -v
将始终取决于我们的数字签名的格式,如果它发生变化,那么它会搞砸我的脚本。
谢谢。
最佳答案
不幸的是,如果不对文件进行更多的分析,确实没有一种简单的方法可以以“非黑客”的方式做到这一点,这将远远超出 bash 脚本的范围和规模。
当 pdftotext
输出数字签名的文本时,该文本并非来自数字签名本身。它作为一个对象存储在 PDF 中,其中包含 pdftotext
忽略的元数据。相反,pdftotext
拾取的只是:也已添加到文件中的文本。
这是来自 Adobe's sample signed PDF document 的示例。一、数字签名的元数据:
这是插入到文档中的文本:
从技术上讲,您可以拥有一个而无需另一个,并且通常伴随数字签名的文本没有既定的格式。因此,您要么陷入困境:
- 像您现在所做的那样,使用
grep
忽略特定文本,这可能不可靠。 - 对所有文件运行 OCR,然后检查 OCR 前后的文本是否存在差异,但这违背了检查的全部目的。
关于linux - 检查 PDF 是否可搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45326112/