检查PDF是否可搜索

时间:2017-07-26 11:49:51

标签: linux bash pdf ocr pdftotext

我写了一个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将始终取决于我们的数字签名格式,如果它发生变化,那么它将搞砸我的剧本。

感谢。

1 个答案:

答案 0 :(得分:1)

不幸的是,在"非hacky"中真的没有一种简单的方法可以做到这一点。没有明显更多涉及文件分析的方式,这远远超出了bash脚本的范围和规模。

pdftotext输出数字签名的文本时,该文本不是来自数字签名本身。它作为PDF中的对象存储,其中pdftotext忽略了元数据。相反,pdftotext选择的只是:文本也被添加到文件中。

以下是Adobe's sample signed PDF document的示例。首先,数字签名的元数据:

Screenshot of digital signature metadata

这是插入文档的文本:

Screenshot of text with same information as in digital signature

从技术上讲,您可以拥有一个没有另一个,并且通常伴随数字签名的文本没有确定的格式。因此,你要么陷入困境:

  • 忽略具有grep的特定文字,正如您现在所做的那样,这可能是不可靠的。
  • 在所有文件上运行OCR,然后检查OCR之前/之后的文本是否有差异,但这样就无法完成首先检查的全部目的。