通过命令行/脚本使现有PDF文件可搜索(OCR)。

我正在寻找一种离线的可脚本化工具,可以通过对现有的PDF文件运行OCR使其可搜索,在不需要人工干预的情况下将原始的不可搜索文件替换为可搜索版本。
例如,www.pdfscannerapp.com - 正好符合我的需求,但它只提供GUI界面,无法进行脚本化操作。
我知道Evernote可以使PDF文件可搜索,但只能在Evernote内部进行搜索。
我不要求完美的OCR结果,只要OCR结果能达到一定可接受的水平就可以,并且希望使用的是小型实用工具,而不是庞大的软件包。
(我注意到AD上有一个类似但不同的问题: Looking for Software to Scan or Convert to Searchable and Signable PDF - 但是,我不需要签名或填写PDF文件,并且我的要求是解决方案可以进行脚本化操作)
编辑:
1) 有几个工具允许提取结构化文本,但为了能够提取,文本必须存在;我主要指的是由扫描仪生成的纯粹的位图PDF。

2) 我并不一定寻求免费解决方案,我非常愿意为一个能满足我的需求的实用工具付费,但我不需要包含OCR功能的臃肿应用程序,其中包含了无数特性但其成本却无法仅仅因为OCR功能而购买。

3) 如上所述,我并不追求完美的OCR,只需一个适度可接受的OCR就可以了。不幸的是,在我的经验中,Tesseract真的低于这个标准。我将"适度可接受"的OCR定义为能够至少正确识别出账单(客户号码)的OCR。

编辑: "可脚本化"或"可自动化",即能够自动触发并在没有任何人类输入的情况下运行。


2不知道做起来会有多难,但经常提到Tesseract OCR,可以在https://code.google.com/p/tesseract-ocr/找到相关信息,并且在[Unix.SE](http://unix.stackexchange.com/questions/tagged/ocr)上也有关于OCR的讨论。 - hhh
1这里有一个类似的问题链接,是否符合您的要求? - nohillside
1你提到了OCR。您的要求是否包括处理PDF中的图像或扫描的PDF文件?对于那些只包含简单后置文本的文件,像“PDF2Text Pilot”这样的PDF转文本转换器可能适合您。 - Tim B
@patrix 我在寻找一个更小巧的实用工具,不一定是免费的,但价格范围要不同。不过,这仍然是一个可行的解决方案,谢谢你。 - magma
@TimothyButler 很不幸,我正在处理扫描的PDF文件(图片)。但是,非常感谢你的提示。 - magma
@magma 你能否请将你的详细要求添加到问题中? - nohillside
OCR的范围很广,软件的质量差异很大。当你添加语言支持时,比如不同语种的支持,可以获得更好的检测质量。如果你是学生,Adobe Acrobat Pro从创意套件中购买大约需要300欧元,否则单独购买大约需要200欧元。我希望能有一些预览,比较不同类型文档的OCR检测结果,比如数学文档、不同语言等,因为质量可能存在很大差异。指定语言可能会有所帮助。另外,我会重新写一下问题,现在太冗长了,试着简化一下。 - hhh
顺便说一下,我看了这个网站:http://www.malcolmhardie.com/ocr/index.html,它使用了Tesseract并且是开源的。但是当我尝试对PNG进行OCR处理时,结果非常糟糕。真是可惜,因为只要稍加努力,它本来可以转换成你想要的格式。 - Diggory
@diggory 很不幸,我对tesseract的经验也非常令人失望。 - magma
@patrix 我已经澄清了要求。你提供的链接中包含了Marco Arment的博客文章,其中有一些有趣的信息。我目前正在尝试使用PDFPen;虽然有点过头了,但已经更接近要求了。 - magma
如果你还没有遇到过的话,还有http://jocr.sourceforge.net和http://www.gnu.org/software/ocrad/这两个网站。 - TJ Luoma
从今天开始,我开始使用iPhone上的Scanbot应用程序,具备自动OCR和自动Dropbox上传功能。非常适合我的工作流程。请注意,Scanbot中的OCR功能是付费的。 - magma
13个回答


不错的项目。在我的测试中,识别效果很差,但我相信这取决于我调整不好的能力。我本来想找一个更简单的解决方案,但如果你想要更多的控制并且可以投入时间,这可能是一个不错的选择。 - magma
与更现代的专有应用相比,Tesseract的表现不是很好。特别是在编码和数学方面存在问题,经常输出大量希腊字符。 - TechZen
操作系统X的版本是否允许PDF输入?Windows版本不允许。 - Doug
1@Doug:我刚刚遇到了“pixReadStream错误:不支持PDF阅读”的问题。但是通过在ImageMagick(https://superuser.com/questions/1469592/how-can-i-convert-a-pdf-into-a-series-of-images-jpgs-or-pngs-via-the-terminal)中间进行转换,似乎是可行的工作流程。 - Matthias W.


看起来是个不错的解决方案,尽管我发现OCR后端Tesseract相当令人失望(很可能是因为我自己在正确配置方面有限制)。 - magma
1我喜欢OCRmyPDF,下面是我的回答,解释了如何使用Docker快速、轻松地安装和拖放自动化它。 - thadk

免责声明:这不是一种OCR解决方案(但这个答案仍然有用于从PDF中提取文本)

有一个叫做Apache Tika的Apache软件基金会项目:

一个工具包,使用现有的解析器库检测和提取各种文档的元数据和结构化文本内容

他们支持使用PDFBox进行PDF文本提取:

可以创建新的PDF文档,操作现有的文档,并能够从文档中提取内容。Apache PDFBox还包括多个命令行实用程序。

最近他们还新增了对OCR(通过Tesserac)的支持

对于基于文本的解决方案,PDFBox非常简单地从PDF中提取文本:

它还有一些其他不错的选项,你可以在ExtractText文档中查看。


这绝对是一个很好的提取文本的选择,但据我所见没有OCR功能。 - magma
1@magma OCR指的是“光学字符识别”,肯定有“OCR功能”。现在你需要澄清一下:你的问题是从像VGA相机生成的低分辨率图像、劣质扫描仪或远距离拍摄的图片中提取文本吗?那么你的问题就不同了,需要考虑到物理因素,比如超分辨率。请提出更具体和简洁的问题,以便能够回答。我建议你将这个问题简化为一个你想要的功能。如果你想要更多的东西,请提一个新的问题。 - hhh
3@hhh,一件事是从二进制文件(例如PDF)中提取文本,使其可用和可读,通过解析二进制格式。这与光学无关。文本已经存在,这些工具只是提取它,以便让您轻松阅读,可以这么说。光学字符识别不同,它试图识别位图中的像素模式,并对它们进行足够的理解,以生成相应的文本片段。 - magma
这并没有回答原始问题。据我所知,pdfbox-app不进行OCR处理。 - Feuermurmel

对于您如何能够从“命令行”进行“脚本化”,我并不完全清楚您的要求。

如果您是在谈论自动化,那么可以使用各种实用工具来实现。

ABBYY FineReader Express + Keyboard Maestro + Hazel

我使用 ABBYY FineReader Express + Keyboard Maestro + Hazel 的方式如下:

  1. Hazel 监视指定文件夹中是否有新的 PDF 文件

  2. 如果找到 PDF 文件,则会在 “ABBYY FineReader Express” 中打开它

  3. 然后,Keyboard Maestro 会自动将 PDF 转换为可搜索的 PDF(OCR),并将文件保存到另一个目录中。

现在,如果您还没有购买 Hazel 和 Keyboard Maestro,那么初始成本可能会相当高(尽管我非常依赖它们,认为它们物超所值)。

PDFPen + AppleScript + 文件夹操作

您也可以使用 PDFPen(或 PDFPenPro)、文件夹操作和 AppleScript 来实现类似的功能。请参考 https://gist.github.com/prenagha/1355037 获取一个示例。

Marco Arment在Mac上做了一次OCR应用的调查,并发现PDFPen的效果很好,而且易于自动化。
通过谷歌搜索"PDFpen applescript OCR"会找到许多其他选择。

好的回答TJ。Hazel真是太棒了,我拥有它并且非常喜欢使用。我目前没有拥有abbyy/keyboard maestro,但是Hazel + PDFPen组合非常出色。总体而言,虽然这里所有的回答都非常好,并且针对不同的受众,但我认为Hazel+PDFPen非常适合原问题。已接受。 - magma
对于ABBYY FineReader Express,我给一个大拇指的支持。目前来说,它是最好的OCR软件。在自己的项目中,我尝试过将近十种OCR软件。 - TechZen

你可以通过将现有的PDF文件转换为文本文件来使其可搜索。为此,您至少需要ImagemagickGhostscript(用于PDF转换)和Tesseract OCR工具。

一些命令行示例:

$ wget http://www.fmwconcepts.com/misc_tests/pdf_tests/test.pdf
$ convert -density 300 -depth 8 test.pdf test.png
$ tesseract test*.png test.txt
$ grep -i --color=auto the test*.txt
**The** details as told by surviving crew members, to **the** German publication Spiegel and published on ABC's

这可以进一步根据您的需求进行扩展。
要安装所需的工具,在OSX上,您可以通过Homebrew进行安装:
brew install imagemagick jpeg libpng ghostscript tesseract

在Linux上使用apt-getyum代替brew
更多OCR工具,请查看:Linux系统上的OCR 相关内容:

这个例子似乎不能处理多个PNG文件。我使用了一个循环并生成了多个文本文件,这样就避免了出现大量奇怪的错误。 - Florian Heigl
我还安装了tesseract-lang,并添加了-l deu参数来处理本地化文本,这大大提高了识别质量。 - Florian Heigl

我会推荐DEVONThink Pro Office。这是一个非常优秀的应用程序,具有很好的AppleScript支持。可惜只有“Pro Office”版本才具备OCR功能-所以你需要支付100英镑(150美元)。
如果你只是用它来进行脚本化OCR,那就有点杀鸡用牛刀了-不过它确实是一个非常好的应用程序。
[编辑] - 啊,刚刚重新读了一下你的帖子-肯定是杀鸡用牛刀!
如果你只是想从shell中使用OCR,你可以尝试与DEVON授权的ABBY交流一下。

http://www.abbyy-developers.com/en:tech:samples:commandline_ocr


虽然OS X上的DEVONThink Pro Office功能过剩,但它很有趣。如果开发者在OS X和iOS上设计它,也许可以工作(保持界面更简单)--你知道有类似的吗?不过这个想法很酷--所以专业版会自动为各种东西添加OCR层,比如截图和PDF文件?用户是否可以以某种方式“编写脚本”来实现呢? - hhh
2是的 - 这个应用程序有一个很好的AppleScript字典,其中包括将存储在应用程序中的图像转换为可搜索的PDF文件。 - Diggory
假设我用iPhone拍照或使用OS X进行截屏,并将它们放入一个名为ProjectA的文件夹中,即使没有指定语言,DEVONThink是否会自动添加OCR层?假设您将它们放入DropBox,然后在OSX上设置DEVONThink自动检查该文件夹,那么您可以同时在OS X和iOS上处理它吗?如果执行得好,这是一个令人着迷的概念... +1 - hhh
在某种程度上,它听起来像是EverNote,EverNote添加了OCR功能,但不允许像这样导出。是否可以通过OCR从该软件中导出您的项目?如果不能,那么一些非常简单的OCR库和一些语言分析库可能是最好的选择。也许另一个选择是ABBY,我还不确定。 - hhh
2它可以识别多种语言: http://i.stack.imgur.com/buDLI.png - Diggory
DEVONThink Pro Office有哪些出口功能?能否轻松导出PDF和其他材料? - hhh
你是指将PDF转换为其他格式,还是只是从应用程序中获取PDF?如果是后者,那么很容易取出PDF文件。 - Diggory
你可以试用150小时,免费玩一下,看看是否适合你:http://www.devontechnologies.com/products/devonthink/devonthink-pro-office.html - Diggory
Devonthink Pro Office的扫描功能很好,但演示版本一天只能扫描有限数量的页面(具体范围未记录),因此可能难以进行脚本测试。我建议使用尽可能小的文档进行工作。 - TechZen

Stackoverflow有关于PDF解析的相关问题,涵盖了PDFBox和Apache的TIKA等PDFBox使用的内容。下面的Ruby代码从PDF中提取文字。您需要具备足够高的分辨率,以使此类代码能够稳定运行。因此,请获取一台分辨率较高的扫描仪,然后查看某些软件是否可用。 示例
  1. https://github.com/yob/pdf-reader/tree/master/examples

SO threads

  1. https://stackoverflow.com/questions/5217783/pdf-parse-to-text-in-java

  2. https://stackoverflow.com/questions/8149179/alternative-to-tika-pdfbox-for-parsing-pdf-in-solr-any-version-later-than-1-4

  3. https://stackoverflow.com/questions/320621/ruby-pdf-parsing-gem-library

  4. https://stackoverflow.com/questions/15186740/haskell-parsing-reading-content-of-pdf-files

[编辑]

我现在不确定我是否理解了你的问题。你想要为各种材料,比如随机照片、截图、没有OCR层的PDF等添加OCR层吗?我不知道解决方案,但我确定有人知道,所以我问了一个具体的问题,如何使用Automator和一些OCR软件来实现:

Automator脚本中有一个OCR软件可以自动添加OCR到材料吗?


再说一遍:我不是在寻找解析或提取已有文本的方法。我是在寻找识别PDF文件中的文本(OCR)的方法,这些文件实际上是图像、位图;它们最初并不包含任何文本。 - magma
@magma,请看一下我的更新。你想要自动添加OCR层,这样即使没有“可搜索的文本”,你也可以在不同类型的文档中进行搜索?如果你能做到这一点,你就可以在Finder中搜索所有的文档——你明白吗?如果苹果在未来的升级中没有做到这一点,我会感到惊讶的... - hhh
根据我的问题所述,是的。 - magma

对于这种自主应用,我是Hazel的铁杆粉丝。 它使得编写脚本操作变得非常简单,无需学习更加面向命令行的工具,如perl或python,并且配合您选择的OCR引擎(我目前使用的是PDF Pen Pro),您应该可以轻松处理文件,减少麻烦。 这两个软件都是付费的,但它们的实用性远远超出了这一个案例。在我的情况下,考虑到将过去的扫描记录(以及持续产生的纸质文件)数字化所需的劳动力,这些软件的价格远远超过了我在其他地方编程所需花费的时间。而且现在我拥有了这两个工具,我可以用它们来完成许多其他任务。

我使用Docker成功实现了高质量的拖放转换。

如果你:

  1. 为你的Mac安装Docker,然后
  2. 创建一个新的Automator应用程序
  3. 并在“运行Shell脚本”操作中添加以下内容。选择传递输入:"作为参数"

/bin/bash脚本内容:

cd "`dirname "$1"`"
/usr/local/bin/docker run --rm -v "$(pwd):/home/docker" jbarlow83/OCRmyPDF --force-ocr "`basename "$1"`" "`basename -s .pdf "$1"`-ocr.pdf"

你只需要将PDF文件拖放到软件上,然后会自动生成一个同名的PDF文件,文件名末尾会加上"-ocr"。
我想这个软件很容易修改,可以返回一个文件给Automator,然后复制到其他地方。有关OCRmyPDF Docker包的更多详细信息。主要工具(也在另一个答案中提到)。
你可以在Automator中使用"获取指定的Finder项目"操作来测试它。
第一次运行时,可能需要更长时间,因为它需要下载OCRmyPDF的Docker镜像(不可见)。在终端中,你也可以运行docker pull jbarlow83/ocrmypdf来加快首次运行速度。 每页高分辨率页面的典型运行时间约为10秒,即使有表格或图表,也能自动识别文本并生成可读的结果。在进行OCR之前,我会使用Sejda裁剪页面,以去除其他页的无意义边距文字。 --force-ocr 参数告诉工具忽略并覆盖之前的OCR尝试,这些尝试在我的情况下通常只是部分和无用的。 编辑于2022年:这个替代脚本使得可以拖动多个文件到应用程序中进行排队和OCR处理。
for f in "$@"
do
cd "`dirname "$f"`"
/usr/local/bin/docker run --rm -v "$(pwd):/app" jbarlow83/ocrmypdf --force-ocr "`basename "$f"`" "`basename -s .pdf "$f"`-ocr.pdf"
done

PDFScannerApp确实具有非官方的脚本支持。请联系作者获取Automator操作。