OCRmyPDF 是一个 Python 应用和库,它给 PDF 里的图片加上了文本“层”,让扫描的图片 PDF 可以被搜索。它用 OCR 来猜测图片里包含的文本。OCRmyPDF 还支持插件,可以自定义它的处理步骤,而且它对包含扫描图片和不需要文本识别的“原生数字”内容的 PDF 非常宽容。

关于 OCR

Optical character recognition 是一种技术,能把打印或手写的文本图片,比如扫描文档,转换成可以选中、搜索和复制的电脑文本。

OCRmyPDF 用的是 Tesseract,一个广为流传的开源 OCR 引擎,来执行 OCR。

关于 PDF

PDF 是页面描述文件,试图精确地保留布局。它们包含 vector graphics,里面可以有光栅对象,比如扫描的图片。因为 PDF 可以包含多页(不像很多图片格式),还能包含字体和文本,所以它们是交换扫描文档的合适格式。

OCRmyPDF 简介 - 图1

一个 PDF 页面可能包含多个图片,即使看起来只有一个。有些扫描仪或扫描软件可能会把页面分成单色文本和彩色区域,比如为了提高压缩比和页面外观。

光栅化 PDF 是生成对应光栅图片的过程。像 Tesseract 这样的 OCR 引擎处理的是图片,而不是可缩放矢量图形或像 PDF 这样的混合光栅-矢量-文本图形。

关于 PDF/A

PDF/A 是 PDF 完整规范的一个 ISO 标准化子集,专为归档设计(‘A’代表 Archive)。PDF/A 和普通 PDF 的主要区别是省略了一些可能影响未来文件可读性的功能,比如嵌入的 Javascript、视频、音频和外部字体的引用。解释 PDF 所需的所有字体和资源都得包含在里面。因为 PDF/A 禁用了 Javascript 和其他嵌入内容,所以它可能更安全。

它有各种符合级别和版本,比如“PDF/A-2b”。

一般来说,扫描文档的首选格式是 PDF/A。有些政府和司法机构,尤其是美国法院,强制要求使用 PDF/A 来处理扫描文档。

因为大多数扫描文档的人都希望长期可读,OCRmyPDF 默认生成 PDF/A-2b。

PDF/A 确实有些缺点。有些 PDF 查看器会显示一个提示,告诉用户文件是 PDF/A 格式,可能会让一些人困惑。另外,它的文件通常比标准 PDF 大,因为它嵌入了某些资源,即使这些资源很常见。PDF/A 文件可以数字签名,但不能加密,以确保未来可读。幸好,从 PDF/A 转成普通 PDF 很简单,任何 PDF 查看器都能处理 PDF/A 文件。

OCRmyPDF 能做什么

OCRmyPDF 分析 PDF 的每一页,确定捕捉页面所有信息所需的色彩空间和分辨率 (DPI),不丢内容。它用 Ghostscript 把每页光栅化,然后对光栅化图片执行 OCR,生成一个 OCR“层”。这个层再被整合回原始 PDF。

虽然可以用像 Ghostscript 或 ImageMagick 这样的程序获取图片,然后通过 Tesseract OCR 处理,但这个过程实际上会生成一个新 PDF,可能会丢失各种细节(比如文档的元数据)。相比之下,OCRmyPDF 可以生成一个改动最小的 PDF 作为输出。

OCRmyPDF 还提供了一些图像处理选项,比如去歪斜,能提升文件视觉质量和 OCR 准确性。用这些选项时,OCR 层会被整合进处理过的图片。

默认情况下,OCRmyPDF 生成 PDF/A 格式的归档 PDF,这是一个更严格的 PDF 功能子集,专为长期归档设计。如果你想要普通 PDF,可以用 --output-type pdf 选项禁用这个功能。

为什么不该手动做这件事

PDF 有点像 HTML 文件,包含文档结构和图片。虽然有些 PDF 可能只显示整页图片,但它们通常还有其他内容,如果不保留就会丢失。

手动处理可能有以下两种方式:

  1. 把每页光栅化成图片,对图片执行 OCR,然后把输出合并成 PDF。这种方法保留了每页的布局,但会重新采样所有图片,可能导致质量下降、文件变大,还会引入压缩伪影等问题。

  2. 提取每张图片,OCR,然后把输出组合成 PDF。这种方法会丢失图片在 PDF 中的使用上下文,可能导致缩放和位置信息丢失。有些扫描 PDF 包含多个图片,分成黑白、灰度和彩色区域,用模板蒙版避免重叠,这样可以提升文件外观同时减小文件大小。重新组装这些图片很麻烦,还可能丢失矢量艺术或非图片部分的文本。

如果 PDF 只是作为图片容器,没有旋转、缩放或裁剪,第二种方法可以无损。

OCRmyPDF 根据输入选项和输入 PDF 本身使用不同策略。一般来说,它会为 OCR 光栅化页面,然后把 OCR 数据整合回原始 PDF。这种方法能处理复杂 PDF,尽可能保留内容。

另外,OCRmyPDF 支持多年开发中出现的各种边缘情况。它能处理 PDF 的功能,比如 Form XObjects 里的图片和带 UserUnit 缩放的页面。它还支持不常见的图片格式,比如非单色 1 位图片,并对不适合 OCR 的文件发出警告。借助 pikepdf 和 QPDF 这样的工具,它还能自动修复损坏的 PDF。你不用懂这些问题的复杂性,用 OCRmyPDF 处理任何 PDF 文件,应该都能得到合理结果。

Limitations 局限性

OCRmyPDF 受限于 Tesseract OCR 引擎的限制。这些限制是任何依赖 Tesseract 的软件都有的:

  • OCR 准确性可能比不上商业 OCR 方案。

  • 它认不出手写内容。

  • 它可能会检测到乱码并报告为 OCR 输出。

  • 当文档包含 -l LANG 参数未指定的语言时,结果可能不理想。

  • Tesseract 可能难以分析文档的自然阅读顺序。比如,它可能认不出两栏文档,试图跨栏连接文本。

  • 低质量扫描会导致 OCR 质量差。换句话说,OCR 输出质量取决于输入质量。

  • Tesseract 不提供文本所属字体家族的信息。

  • Tesseract 不把文本分成段落或标题。它只提供文本和它的边界框。所以生成的 PDF 不含文档结构信息。

Ghostscript 也有一些限制:

  • 如果启用了 Ghostscript PDF/A,包含 JPEG 2000 编码内容的 PDF 可能会转成 JPEG 编码,可能引入压缩伪影。

  • Ghostscript 可能会根据内部算法有损转码灰度和彩色图片。可以用 --pdfa-image-compression 设置为 jpeglossless 来强制所有图片为一种类型,抑制这种行为。Ghostscript 没有选项保持输入图片格式。(现代 Ghostscript 可以不转码复制 JPEG 图片。)

  • Ghostscript 的 PDF/A 转换会移除非标准 XMP 元数据命名空间的 XMP 元数据,特别是 PRISM Metadata 会被移除。

  • Ghostscript 的 PDF/A 转换可能会移除或禁用超链接和其他活跃内容。

可以用 --output-type pdf 禁用 PDF/A 转换,生成标准非归档 PDF。

关于 OCRmyPDF 本身:

  • 当前测试套件中没有包含使用透明度的 PDF

Similar programs 类似程序

据作者所知,OCRmyPDF 是功能最丰富、测试最彻底的命令行 OCR PDF 转换工具。如果它不能满足你的需求,欢迎贡献和建议。

Ghostscript 最近新增了三个“pdfocr”输出设备。它们通过光栅化所有内容并将所有页面转换为单一色彩空间来工作。

Web front-ends 网页前端

OCRmyPDF 的 Docker 镜像提供了一个网页服务前端,允许通过 HTTP 提交文件并下载结果。这是一个 HTTP 服务器,旨在展示如何将 OCRmyPDF 集成到网页服务中。它不适合部署在公共互联网上,也不提供任何安全措施。

另外,以下第三方集成可用:

  • Paperless-ngx 是一个免费的文档管理系统,用 OCRmyPDF 对上传的文档执行 OCR。

  • Nextcloud OCR 是 Nextcloud 私有云软件的一个免费插件。

OCRmyPDF 并非设计为抵御含恶意软件的 PDF 的安全工具(见 Using OCRmyPDF online)。用户应确保遵守 OCRmyPDF 及其所有依赖的许可。特别是,OCRmyPDF 需要 Ghostscript,后者使用 AGPLv3 许可。