【问题标题】:Checking if PDF is searchable检查 PDF 是否可搜索
【发布时间】:2023-12-10 06:53:02
【问题描述】:

我编写了一个 bash 脚本,用于从扫描的 PDF 文件中提取纯文本。我有很多 PDF,但有些是扫描的,有些不是。所以现在我的主要目标是通过检查 PDF 是否已经可搜索来改进我的脚本,因此不需要提取 OCR。

我试过了:

pdftext -nopgbrk pdf_file.pdf wordlist

将可能的 OCR 文本存储在 wordlist 中,然后我可以检查它是否为空并确定它是否是可搜索的 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 将始终取决于我们的数字签名的格式,如果它发生变化,那么它会搞砸我的脚本。

谢谢。

【问题讨论】:

  • 你可能是对的。我用我的 OCR 脚本发布了这个问题,该脚本与编程相关,但是当你提到我遇到的问题本身可能是题外话,所以 Unix & Linux Stack Exchange 可能是一个更好的发布它的地方.无论如何,如果有人带着脚本或算法来解决我的问题,那么它也可能与编程有关。还是很抱歉。

标签: linux bash pdf ocr pdftotext


【解决方案1】:

不幸的是,真的没有一种简单的方法可以以“非 hacky”的方式执行此操作,而无需对文件进行更多涉及的分析,这将远远超出 bash 脚本的范围和规模。

pdftotext 输出数字签名的文本时,该文本并非来自数字签名本身。它以对象的形式存储在 PDF 中,带有 pdftotext 忽略的元数据。相反,pdftotext 得到的只是:文本也已添加到文件中。

这是来自Adobe's sample signed PDF document 的示例。一、数字签名的元数据:

这是插入到文档中的文本:

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

  • 使用 grep 忽略特定文本,就像您现在所做的那样,这可能不可靠。
  • 对所有文件运行 OCR,然后检查 OCR 之前/之后的文本是否存在差异,但这首先破坏了检查的全部目的。

【讨论】:

  • 要添加到最后一个要点,我们提供的一些 OCR 工具包括“在具有可搜索文本层的 PDF 上跳过 OCR”的选项。所以你仍然会在整个集合上运行 OCR,但只有基于图像的 PDF 才会被 OCR。结果将是您现有的文件,其文本通过未触及 + 图像 PDF 传递,现在带有 OCRed 文本。
  • @IlyaEvdokimov 但是,在这种情况下,处理器不会忽略仍然需要 OCR 的文件,但恰好有一个可搜索的文本层,其中仅包含有关数字签名的信息?根据我对 OP 困境的理解,这就是问题的症结所在。似乎需要进行某种更复杂的分析,将文本与数字签名中的信息进行比较、PDF 是否有图像,并对是否对该特定文档运行 OCR 做出有根据的猜测。