python - 如何区分数字创建的 PDF 和可搜索的 PDF?
问题描述
我目前正在分析一组 PDF 文件。我想知道有多少 PDF 文件属于这 3 个类别:
- 数字创建的 PDF:文本在那里(可复制)并且保证是正确的,因为它是直接创建的,例如从 Word
- 仅图像 PDF:扫描的文档
- 可搜索的 PDF:扫描的文档,但使用了 OCR 引擎。OCR 引擎将文本放在图像“下方”,以便您可以搜索/复制内容。由于 OCR 非常好,因此大多数情况下这是正确的。但不保证正确。
由于每个 PDF 都包含文本,因此在我的域中识别纯图像 PDF 很容易。如果我无法提取任何文本,它只是图像。但是我怎么知道它是“只是”一个可搜索的 PDF 还是一个数字创建的 PDF?
顺便说一句,这并不像我看到的扫描文档那样简单,因为我看到了 Producer 字段显示“Microsoft Word”的扫描文档。
注意:作为人类,这很容易。我只是放大文字。如果我看到像素,它“只是”可搜索的。
以下是用于测试解决方案的 3 个示例 PDF 文件:
我尝试/想到的
- 使用创建者/制作者:我在扫描的文档中看到“Microsoft Word”。这也将是乏味的。
- 嵌入字体:您可以提取嵌入字体。这个想法是扫描的文档不会嵌入字体,而只是使用默认字体。从这个例子可以看出,这个想法是错误的。
解决方案
使用 PyMuPDF,您可以轻松删除 @ypnos 建议所需的所有文本。
作为替代方案,您还可以使用 PyMuPDF 检查文本是否隐藏在 PDF 中。在 PDF 的相关“迷你语言”中,这是由命令触发的3 Tr
(“文本渲染模式”,例如参见https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/的第 402 页pdf_reference_1-7.pdf)。因此,如果所有文本都受此命令的影响,则不会呈现任何文本 - 允许得出“这是一个 OCR 页面”的结论。
推荐阅读
- php - 如何在多维数组中调用关联数组键?
- oracle - 使用序列构建 Oracle 视图
- css - 正文中断布局上的等宽字体
- java - 使用 Java 和 Python 的 uuencoded 文件之间的区别
- sql-server - 如何根据 json 中的 id 从表中删除行
- php - 使用 PHP SoapClient 将多个值发送到同一个字段
- python - AttributeError:模块“pydotplus”没有属性“节点”
- python - 未定义字符的 Unicode 编码错误
- django - Django - 空表单无法保存在数据库中
- c++ - 使用命名空间的 QT 测试