linux - 检查 PDF 是否可搜索

标签 linux bash pdf ocr pdftotext

我编写了一个 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 的示例。一、数字签名的元数据:

Screenshot of digital signature metadata

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

Screenshot of text with same information as in digital signature

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

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

关于linux - 检查 PDF 是否可搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45326112/

相关文章:

ios - 具有多层的 PDF 和 iOS 的 CGPDF* 库

java - 使用 PDFBox 库在 PDF 中生成分层书签

linux - 来自 get_user_pages 的 ERESTARTSYS 和挂起的致命信号?

linux - 过滤命令输出并将其保存在 Json 格式列表中的 Shell 脚本

linux - 如何连接仅在同一天生成的 linux/unix 目录中的文件?

linux - Shell 脚本使用 netstat 查明某个端口是否正在被监听?

c - 在C程序中使用cp命令获取要复制的文件列表

angular - 如何在 Angular 应用程序中为 PDFMake 导入自定义字体?

linux - 在 .ebextension 中检查 AWS EC2 上的服务

c++ - 无法从 char 三重指针获取或打印 wstring 元素