介绍

OCRmyPDF 是一个 Python 应用程序和库,它为 PDF 中的图像添加文本“层”,使扫描的图像 PDF 可搜索。它使用 OCR 来猜测图像中包含的文本。OCRmyPDF 还支持插件,使其处理步骤可定制,并且对包含扫描图像和不需要文本识别的“原生数字”内容的 PDF 具有高度容忍性。

关于OCR

光学字符识别 是一种将打印或手写文本的图像(例如扫描文档中的图像)转换为可以选择、搜索和复制的计算机文本的技术。

OCRmyPDF 使用 Tesseract,一个广泛 可用的开源 OCR 引擎,来执行 OCR。

关于PDF

PDF是页面描述文件,旨在精确保留布局。它们包含矢量图形,这些图形可以包含光栅对象,如扫描的图像。由于PDF可以包含多个页面(与许多图像格式不同)并且可以包含字体和文本,因此它们是交换扫描文档的合适格式。

图像

一个PDF页面可能包含多个图像,即使它看起来只有一个图像。例如,一些扫描仪或扫描软件可能会将页面分割为单色文本和彩色区域,以增强页面的压缩比和外观。

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

关于PDF/A

PDF/A 是一个 ISO 标准化的 PDF 规范子集,专为存档设计(‘A’ 代表存档)。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 功能,如表单 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 也施加了一些限制:

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

  • Ghostscript 可能会根据内部算法对灰度和彩色图像进行转码,这可能会导致有损压缩。可以通过将 --pdfa-image-compression 设置为 jpeglossless 来抑制此行为,从而将所有图像设置为一种类型或另一种类型。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许可证下授权。