如何知道 PDF 是不是仅包含图像或已被 OCR 扫描以进行搜索?

Posted

技术标签:

【中文标题】如何知道 PDF 是不是仅包含图像或已被 OCR 扫描以进行搜索?【英文标题】:How to know if a PDF contains only images or has been OCR scanned for searching?如何知道 PDF 是否仅包含图像或已被 OCR 扫描以进行搜索? 【发布时间】:2010-12-02 03:54:06 【问题描述】:

我有一堆来自扫描文档的 PDF 文件。这些文件包含图像和文本的混合。有些被扫描为没有 OCR 的图像,因此每个 PDF 页面都是一个大图像,即使整个页面都是文本。其他的则使用 OCR 进行扫描,并包含图像和存在文本的可搜索文本。在许多情况下,甚至图像中的单词都可以搜索。

我想在 Acrobat 8​​ Pro 中使用 OCR 自动识别所有扫描文档中的文本,但我不想重新 OCR 已经通过 OCR 过程的文件过去的。有谁知道是否有办法分辨哪些只包含图像,哪些已经包含可搜索的文本?

我打算在 C# 或 VB.NET 中执行此操作,但我不认为能够区分这两种文件取决于语言。

【问题讨论】:

【参考方案1】:

经过 OCR 处理以使文本可搜索的转换为 PDF 的扫描图像通常包含呈现为“不可见”的文本部分。因此,您在屏幕上(或打印时在纸上)看到的仍然是原始图像。但是,当您成功搜索时,您会在不可见文本上突出显示匹配项。

我建议您查看源自 XPDF 的命令行工具 pdffonts(.exe)pdfinfo(.exe)pdftotext(.exe)。下载请看这里:http://www.foolabs.com/xpdf/download.html

pdffonts 的用法示例:

C:\downloads\> pdffonts cisco-ip-phone-7911-guide6.1.pdf
name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
LGOKFL+Univers-BlackOblique          Type 1C           yes yes no   13171  0
LGOKGM+Univers-Black                 Type 1C           yes yes no   13172  0
[....]

此 PDF 使用字体(由“名称”列表示)、嵌入字体(由“emb”列中的“是”表示)并使用子集字体(由“子”列中的“是”表示列)。

C:\downloads\> pdffonts examle1.pdf
name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
Univers-BlackOblique                 Type 1C           yes no  no   14    0
Arial                                TrueType          no  no  no   15    0

此 PDF 使用 2 种字体(由“名称”列表示)。字体“Universe-BlackOblique”完全嵌入(由“emb”列中的“yes”和“sub”列中的“no”表示)。还使用了“Arial”字体,但没有嵌入。

C:\downloads\> pdffonts examle2.pdf
name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------

此 PDF 不使用单一字体,因此没有嵌入任何文本(因此也没有 OCR)。

pdftotext 的用法示例:

C:\downloads\> pdftotext ^
                   -layout ^
                   cisco-ip-phone-7911-guide6.1.pdf ^
                   cisco-ip-phone-7911-guide6.1.txt

这将从 PDF 中提取所有文本字符串(试图保留与原始布局的一些相似之处)。如果 PDF 中没有文本,您就会知道没有 OCR...

【讨论】:

我尝试了你的方法,但是对于一些扫描的 pdffile “pdffonts”命令仍然返回 Helvetica 字体?您能否解释或指导我如何更准确地实现这一目标。谢谢 @DanglingPiyush:如果没有这样的 Scan-PDF 文件样本,我无法告诉您 Helvetica 来自哪里。您能否提供一个显示此行为的示例页面? fileconvoy.com/… 这是示例 pdf 的链接,它仅包含扫描图像,但 pdffonts 显示 Helvectica 字体。请看一下。 感谢您的宝贵时间。:) :你看过了吗?【参考方案2】:

各种 PDF 工具可以告诉您是否有文本。有些可用作 COM 控件,甚至可能是原生 .NET 控件。

【讨论】:

你能推荐一个你知道有效的,或者我应该尝试的吗?【参考方案3】:

在 acrobat 中打开文档。转到文件-> 属性。查看“高级”部分并找到 PDF Producer。如果它读到“Paper Capture...”之类的内容,那么它已经过 OCR。

希望这会有所帮助。

【讨论】:

对,在我的示例集中,基于图像的 PDF 有一个空白的 PDF Producer,但 OCR 显示的是“Adobe Acrobat 8​​.16 Paper Capture Plug-in”。但我找到了另一个具有可选文本的文本,制作者是“Acrobat Distiller 5.0.5 (Windows)”。另一个带有文本“createpdf.adobe.com v5.1”。其他文字为“Microsoft Office Word 2007”和“GPL Ghostscript 8.54”。对于基于图像的 PDF,制作者似乎是空白的,但对于包含文本的 PDF,它有一些其他值。【参考方案4】:

Apago 的 pdfspy 将信息从 PDF 提取到 XML 文件中。它包括有关文档的信息,包括图像和文本。对于您的项目,有用的信息包括图像数量和大小以及 OCR(隐藏)文本的位置。

http://www.apagoinc.com/pdfspy

【讨论】:

【参考方案5】:

抱歉挖掘了旧线程,但如果您发现了这个,请查看我的线程:

Batch OCR Program for PDFs

您可以通过在 unix/linux/osx 中添加 pdf 或在 python 中以“rb”模式打开它来获取有关 pdf 的额外信息。 (当然那是 python,你不想使用它,但也许它有类似的东西)。

【讨论】:

【参考方案6】:

使用“dtsearch”为所有pdf文件创建索引...然后“查看日志文件”的索引过程以检查未索引的pdf文件列表。

【讨论】:

【参考方案7】:

技术含量非常低的解决方案:任何已扫描文本的文件无疑都会包含字母“a”,因此请搜索所有不包含字母 a 的文件内容。即“不是”。任何显示的文件都不会经过 OCR 处理

【讨论】:

以上是关于如何知道 PDF 是不是仅包含图像或已被 OCR 扫描以进行搜索?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用ABBYY FineReader PDF 15来制作双层PDF

如何从图像中提取所需的文本部分,而不是使用 OCR 提取图像中的所有文本?

如何在opencv中检测仅包含文本的图像是不是模糊

按行将 PDF 拆分为图像(OCR 模型训练)

如何制作3层的PDF电子书

jslint 是不是有缩进选项或已被删除?