如何将PDF格式转换为文本可搜索的PDF格式?

我在pdf中有许多扫描文档,我希望能够搜索它们。 我怎样才能做到这一点?

基本上我必须OCR pdf,然后将提取的文本混合回新的pdf。 我已经不成功地尝试了许多不同的解决方案(包括将OCR信息添加到PDF中的解决方案)。

  1. pdfocr (给我这个问题: https : //github.com/gkovacs/pdfocr/issues/7 )
  2. pdfsandwich (软件中心说这是一个糟糕的包,我不应该安装它)
  3. OCRfeeder(在软件中心)很好地导出到odt,但在导出到pdf时没有反应。
  4. Gscan2pdf导出全黑(但可搜索)的图像,如本讨论中所述 。
  5. 我不认为Pdfxchange查看器可以处理超过500页的文件上的ocr。

有没有我不知道的软件包? 或者这样做的脚本?

Ubuntu <16.04

根据Glutanimate的评论,我找到了一个有效的解决方案。 它是OCRmyPDF脚本 。

git clone https://github.com/fritz-hh/OCRmyPDF cd OCRmyPDF sh ./OCRmyPDF.sh -h # to see the usage 

如果您收到一条消息,说您应该安装GNU parallel。 它可以完成(跟随https://askubuntu.com/a/298598/115155 )(第二行是可选的,取决于你的风味和版本):

 sudo apt-get install parallel sudo rm /etc/parallel/config 

最后,您可以使用以下命令OCR您的pdf:

 sh ./OCRmyPDF.sh input.pdf output.pdf # change input and output to the files you want 

如果命令看起来没有响应,则可以使用-v标志(可以逐步使用-vv-vvv )来增加详细程度。 最好先用较短的pdf测试结果。 您可以按如下方式缩短pdf:

 pdftk A=input.pdf cat A1-5 output output.pdf 

Ubuntu> = 16.04

从Ubuntu 16.04开始,OCRmyPDF已成为真正的apt。 赶紧跑

 sudo apt install ocrmypdf ocrmypdf -h # to see the usage 

最后,您可以使用以下命令OCR您的pdf:

 ocrmypdf input.pdf output.pdf # change input and output to the files you want 

如果命令看起来没有响应,则可以使用-v标志(可以逐步使用-vv-vvv )来增加详细程度。 最好先用较短的pdf测试结果。 您可以按如下方式缩短pdf:

 pdftk A=input.pdf cat A1-5 output output.pdf 

如果您有任何疑问,请查看新的Github Repo 。

pdfsandwich完成这项工作。 我不知道软件中心提供了一个软件包,但我在项目网站上提供了Ubuntu deb软件包(详见http://www.tobias-elze.de/pdfsandwich/ ),包括当前最新版本(0.1.2),这在任何软件中心都不太可能。

如果您有扫描文件scanned_file.pdf ,只需致电

 pdfsandwich scanned_file.pdf 

生成文件scanned_file_ocr.pdf ,并将识别的文本添加到扫描的页面。

与大多数现有解决方案相比,它自动检测安装的tesseract版本并相应地调整其行为。 另外,它在OCR处理之前执行扫描图像的预处理,例如去偏斜或去除暗边等,这可以显着改善光学字符识别。

免责声明:我是pdfsandwich的开发者,因此有很大的偏见。

@ don.joey用ocrmypdf脚本回答。 但是,它现在可以直接安装(从16.10开始)。

 sudo apt install ocrmypdf 

然后,您必须安装所需的tesseract语言。

要列出系统中已有的语言,请键入:

 tesseract --list-langs 

如果您错过了一个,请安装它。 例如,

 sudo apt install tesseract-ocr-spa 

现在,您可以使用以下命令生成可搜索的PDF(其质量将根据扫描的文档而变化)

 ocrmypdf -l 'spa' old.pdf new.pdf 

当然,您可以在其手册页中查看其他一些选项。

OCRfeeder有一个错误

 /usr/lib/python2.7/dist-packages/reportlab/pdfgen/textobject.py 

第436行应为:

  lines = asUnicode(stuff).strip().split('\n') # bug here, was: # lines = '\n'.split(asUnicode(stuff).strip()) 

改变了这一点,它对我有用