我写了一个bash脚本,从扫描的PDF文件中提取纯文本。我有很多PDF,但有些是扫描的,有些则不是。所以现在我的主要目标是通过检查PDF是否已经可搜索来改进我的脚本,因此不需要提取OCR。
我试过了:
pdftext -nopgbrk pdf_file.pdf wordlist
在wordlist
中存储可能的OCR文本,然后我可以检查它是否为空,并确定它是否是可搜索的PDF。
我还尝试pdffonts pdf_file.pdf
检查该PDF中是否有字体,因此是否有文字。
两种方式都很好,但在某些情况下失败了。
例如,我需要对OCR进行数字签名的一些PDF,这些签名总是为PDF添加文本层。因此,当我运行这两个命令中的任何一个时,它将输出签名的文本或它正在使用的字体。这就像是因为签名而找到了纯文本。它可能只是带有数字签名的扫描PDF,但它将被检测为纯文本PDF。
数字签名总是以这种方式添加文字(使用Helvetica字体):
签名:姓名
日期:日期CEST
公司:公司名称
所以:
pdftext -nopgbrk pdf_file.pdf wordlist | grep -v -E 'Signed|Date|Company'
我可以设法删除这些行,所以如果它真的是扫描的PDF,输出将为空。
它适用于某些PDF,直到我注意到其他格式的签名,所以我觉得这几乎是一种解决方法而不是一个很好的解决方案。
有没有办法检查PDF是否可以完全搜索?我只需要一种方法来提取PDF文本但省略数字签名。此外grep -v
将始终取决于我们的数字签名格式,如果它发生变化,那么它将搞砸我的剧本。
感谢。
答案 0 :(得分:1)
不幸的是,在"非hacky"中真的没有一种简单的方法可以做到这一点。没有明显更多涉及文件分析的方式,这远远超出了bash脚本的范围和规模。
当pdftotext
输出数字签名的文本时,该文本不是来自数字签名本身。它作为PDF中的对象存储,其中pdftotext
忽略了元数据。相反,pdftotext
选择的只是:文本也被添加到文件中。
以下是Adobe's sample signed PDF document的示例。首先,数字签名的元数据:
这是插入文档的文本:
从技术上讲,您可以拥有一个没有另一个,并且通常伴随数字签名的文本没有确定的格式。因此,你要么陷入困境:
grep
的特定文字,正如您现在所做的那样,这可能是不可靠的。