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

我有一些以PDF格式扫描的文件,我想要能够对它们进行搜索。我该如何做到这一点?
基本上,我需要对PDF进行OCR处理,然后将提取出的文本混合到一个新的PDF中。我已经尝试过多种不同的解决方案(包括在Adding OCR info to a PDF中找到的方法),但都没有成功。
1. pdfocr(导致我遇到了这个问题:https://github.com/gkovacs/pdfocr/issues/7
2. pdfsandwich(软件中心说它是一个糟糕的软件包,不建议安装)
3. OCRfeeder(在软件中心)可以很好地将文件导出为odt格式,但在导出为pdf时没有反应。
4. Gscan2pdf导出的图像全是黑色的(但可搜索),详细情况请参考此讨论
5. 我认为Pdfxchange viewer无法处理超过500页的文件进行即时OCR。
有没有我不知道的软件包?或者有没有能够实现这个功能的脚本?

3我自己还没有尝试过,但是我之前看到有人推荐过这个项目。你可以在此处找到该项目的详细信息:https://github.com/fritz-hh/OCRmyPDF。 - Glutanimate
2我刚刚写了pdf2searchablepdf。它依赖于tesseract。它运行良好。非常容易使用。在这里查看。https://askubuntu.com/a/1187881/327339 - Gabriel Staples
7个回答

从Ubuntu 16.04开始,OCRmyPDF已经可以通过apt进行安装。只需运行以下命令即可:
sudo apt install ocrmypdf
ocrmypdf -h   # to see the usage

最后,您可以使用以下命令对您的PDF进行OCR处理:
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

你是否愿意接受自己的答案并解决问题?(这样就不会出现在未回答的列表中) - Registered User
只需在Ubuntu 16.04上运行sudo -H pip install git+https://github.com/jbarlow83/OCRmyPDF即可。 - Martin Thoma
2对于Ubuntu 16.10及更高版本,您只需执行 sudo apt install ocrmypdf 即可。 - endolith
你对颠倒Ubuntu版本的顺序或者甚至删除旧版Ubuntu的解释有什么看法?我认为现在没有人会使用低于16.04版本的Ubuntu。 - Martin Thoma
有道理,马丁 - don.joey

@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

你当然可以查看它的手册以获取一些额外选项。


先生,我给你点赞了! - don.joey

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的开发者,因此存在严重的偏见。


听起来很棒,但为什么我在Ubuntu 16.04上使用apt-get安装的pdfsandwich版本0.1.4将每个字符转换为黑色矩形? - Valentas
1没有更多的细节很难回答这个问题。首先,我建议使用更新版本的工具。当前版本是0.1.6。你可以在网站上找到适用于Ubuntu的deb包。其次,如果这并没有帮助,你可以尝试使用选项-verbose来获取更多详细信息,并利用这些信息提交一个错误报告。 - Tobias Elze
几个问题。转换:尝试执行不被安全策略允许的操作“PDF”@错误/constitute.c/IsCoderAuthorized/408。所以我必须从源代码安装ImageMagick,从https://imagemagick.org/script/install-source.php下载,然后我遇到了“加载共享库时出错:libMagickCore-7.Q16HDRI.so.6:无法打开共享对象文件:“没有那个文件或目录””,这个解决方案通过运行“sudo ldconfig /usr/local/lib”来解决。ImageMagick版本为7.0.8-56,通过“identify -version”获取。 - pierrely
如果您计划操作或裁剪PDF文件,可能值得添加这些实用工具。1. 使用pdfshuffler将左右页面(双面原件)拆分。2. 使用pdftk和pdf chain(作为一个jar文件)分别拆分文件的偶数页和奇数页。4. 使用pdfquench裁剪页面。我还需要安装gir1.2-goocanvas-2.0、gir1.2-poppler-0.18、python-pygoocanvas、python-poppler和python-pypdf2。pdfsandwich效果很好,文件大小减小了10倍。谢谢。Ubuntu 19.04还可以使用pdfsam来拆分和合并文件,在下载后作为Java jar文件运行。 - pierrely
只是想提醒大家,对于任何有需要的人来说,2022年的pdfsandwich非常好用。 - Vadim Peretokin

我曾经遇到同样的问题,所以我在周末写了这个脚本。试试看吧,效果非常好!它是一个简单的封装 tesseract 的工具。它使用 pdftoppm 将 PDF 转换为一堆 TIFF 文件,然后使用 tesseract 对它们进行光学字符识别(OCR),并生成可搜索的 PDF 作为输出。所有中间临时文件在脚本完成后会自动删除。

源代码:https://github.com/ElectricRCAircraftGuy/PDF2SearchablePDF

安装和使用 pdf2searchablepdf 的说明:

在 Ubuntu 18.04 上进行测试,日期为2019年11月11日。

安装:

git clone https://github.com/ElectricRCAircraftGuy/PDF2SearchablePDF.git
./PDF2SearchablePDF/install.sh
sudo apt update
sudo apt install tesseract-ocr

使用:

# General:
pdf2searchablepdf [options] <input.pdf|dir_of_imgs> [lang]

# Make a PDF searchable:
pdf2searchablepdf mypdf.pdf

# Make an entire directory of images into a single searchable PDF:
pdf2searchablepdf directory_of_imgs

你现在会有一个名为mypdf_searchable.pdf的pdf文件,其中包含可搜索的文本!
完成。这个封装器没有Python依赖,因为它目前完全是用bash编写的。
参考资料或相关资源:
1. PDF2SearchablePDF: https://github.com/ElectricRCAircraftGuy/PDF2SearchablePDF 2. 如何将PDF转换为可搜索的文本PDF? 3. 最好、最简单的OCR解决方案是什么? 4. 从PDF中提取嵌入的图像 5. pdfsandwich: 这是我刚发现的另一种值得一试的替代软件包!http://www.tobias-elze.de/pdfsandwich/ 6. 如何对PDF文件进行OCR并获取其中存储的文本? 7. [如何使用pdftoppm将PDF转换为一系列图像] 从PDF中提取嵌入的图像

操作系统:Ubuntu 18.04

首先,使用以下命令安装tesseract-ocr

apt-cache show tesseract-ocr
sudo apt-get update && sudo apt-get upgrade
apt-get install tesseract-ocr --print-uris
apt-get install tesseract-ocr
sudo !!

如果您打算在tesseract中使用英语以外的语言,则需要安装相应的语言包。例如,对于葡萄牙语,您需要执行以下操作:
sudo apt-get install tesseract-ocr-por

否则,您将会收到错误提示:
Error opening data file /usr/share/tesseract-ocr/4.00/tessdata/por.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to your 
"tessdata" directory.
Failed loading language 'por'
Tesseract couldn't load any languages!
Could not initialize tesseract.

如果你在谷歌上搜索“tesseract PDF”,你可能会找到这个有点过时的帖子。然而,它给了你一些有用的提示。你首先需要将你的.pdf文件转换为.tiff文件。运行:
convert -density 125 originalfile.pdf -depth 8 -alpha Off newfile.tiff

如果像过时的帖子里一样,你忘记添加 alpha -Off ,你将会得到以下错误:
Tesseract Open Source OCR Engine v4.0.0-beta.1 with Leptonica
Error in pixReadFromTiffStream: spp not in set {1,3,4}

现在你可以运行最后的命令了。在你的原始PDF文件是葡萄牙语的特殊情况下,你将需要使用以下命令:
tesseract -l por newfile.tiff output pdf 

生成的文件将被命名为output.pdf。例如,如果您的PDF文件是法语的,在安装相应的tesseract-ocr-fra之后,您将运行以下命令:
tesseract -l fra newfile.tiff output pdf 

再次,所需的文件将是output.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())

我修改了这个,对我起作用了


从Ubuntu 16.04开始,OCRmyPDF可以通过apt进行安装。只需运行以下命令即可安装:
sudo apt install ocrmypdf

你还可以运行这个命令来查看它的用法:
ocrmypdf -h

终于,您可以使用以下命令来对您的PDF进行OCR处理:
ocrmypdf input.pdf output.pdf

(将input.pdfoutput.pdf更改为您想要的文件)

这只是被接受答案的复制品。 - Thorbjørn Ravn Andersen