如何知道 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