引言
OCRmyPDF 是一个 Python 应用程序和库,它为 PDF 中的图像添加文本“层”,使扫描的图像 PDF 变得可搜索。它使用 OCR 来猜测图像中包含的文本。OCRmyPDF 还支持插件,这些插件可以定制其处理步骤,并且它对包含扫描图像和不需要文本识别的“原生数字”内容的 PDF 具有很高的容忍度。
关于 OCR
光学字符识别是一种技术,它将打印或手写文本的图像(例如扫描文档中的文本)转换为可选择、搜索和复制的计算机文本。
OCRmyPDF 使用 Tesseract,这是一个广泛可用的开源 OCR 引擎,来执行 OCR。
关于 PDF
PDF 是页面描述文件,旨在精确地保留布局。它们包含 矢量图形,矢量图形可以包含光栅对象,例如扫描的图像。由于 PDF 可以包含多个页面(与许多图像格式不同),并且可以包含字体和文本,因此它们是交换扫描文档的合适格式。
一个 PDF 页面可能包含多个图像,即使它看起来只有一个图像。例如,一些扫描仪或扫描软件可能会将页面分割成单色文本区域和彩色区域,以提高页面的压缩率和外观。
将 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 可能只显示一个全页图像,但它们通常包含如果不保留就会丢失的额外内容。
手动过程可以采用以下任一方法:
将每一页栅格化为图像,对图像执行 OCR,然后将输出合并到 PDF 中。这种方法保留了每一页的布局,但会对所有图像进行重新采样,可能导致质量下降、文件大小增加以及引入压缩伪影等问题。
提取每个图像,执行 OCR,并将输出组合到 PDF 中。这种方法会丢失图像在 PDF 中使用的上下文,可能导致与图像缩放和位置相关的信息丢失。一些扫描的 PDF 包含分割成黑白、灰度和彩色区域的多个图像,并带有模板遮罩以防止重叠,因为这可以在减小文件大小的同时增强文件外观。重新组合这些图像可能具有挑战性,并且存在丢失不属于图像部分的矢量图或文本的风险。
在 PDF 仅用作图像容器而没有任何旋转、缩放或裁剪的情况下,第二种方法可以是无损的。
OCRmyPDF 根据输入选项和输入的 PDF 本身采用多种策略。通常,它会将页面栅格化用于 OCR,然后将 OCR 数据重新集成到原始 PDF 中。这种方法使其能够处理复杂的 PDF 并尽可能保留其内容。
此外,OCRmyPDF 支持多年开发过程中出现的各种边缘情况。它兼容 PDF 特性,例如 Form XObjects 中的图像以及具有 UserUnit 缩放的页面。它还支持不太常见的图像格式,例如非单色 1 位图像,并提供关于您可能不希望进行 OCR 的文件的警告。得益于 pikepdf 和 QPDF 等工具,它可以自动修复损坏的 PDF。您不需要了解这些问题的复杂性;您应该能够使用 OCRmyPDF 处理任何 PDF 文件,并获得合理的结果。
局限性
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
设置为jpeg
或lossless
,可以将所有图像设置为一种类型或另一种类型,从而抑制此行为。Ghostscript 缺乏保留输入图像格式的选项。(现代 Ghostscript 可以在不转码的情况下复制 JPEG 图像。)Ghostscript 的 PDF/A 转换会移除任何不属于 PDF 标准 XMP 元数据命名空间的 XMP 元数据。特别是 PRISM 元数据会被移除。
Ghostscript 的 PDF/A 转换可能会移除或禁用超链接和其他活动内容。
您可以使用 --output-type pdf
来禁用 PDF/A 转换,并生成标准的非归档 PDF。
关于 OCRmyPDF 本身:
使用透明度的 PDF 目前在测试套件中没有体现
类似的程序
据作者所知,OCRmyPDF 是功能最丰富、经过最彻底测试的命令行 OCR PDF 转换工具。如果它不能满足您的需求,欢迎贡献和提出建议。
Ghostscript 最近添加了三个“pdfocr”输出设备。它们通过将所有内容栅格化并将所有页面转换为单个色彩空间来工作。
Web 前端
OCRmyPDF 的 Docker 镜像提供了一个 Web 服务前端,允许通过 HTTP 提交文件并下载结果。这是一个 HTTP 服务器,旨在演示如何将 OCRmyPDF 集成到 Web 服务中。它不适合部署在公共互联网上,并且不提供任何安全措施。
此外,还提供以下第三方集成:
Paperless-ngx 是一个自由软件文档管理系统,它使用 OCRmyPDF 对上传的文档执行 OCR。
Nextcloud OCR 是 Nextcloud 私有云软件的一个自由软件插件。
OCRmyPDF 未设计用于抵御包含恶意软件的 PDF(参见 在线使用 OCRmyPDF)。用户应确保遵守 OCRmyPDF 的许可及其所有依赖项的许可。特别是,OCRmyPDF 需要 Ghostscript,该软件根据 AGPLv3 许可。