OCRmyPDF 进阶用法全解:unpaper 控制、OCR 引擎参数、光栅化/渲染器选择与 PDF/A 转换机制
2026/9/6 19:29:15 网站建设 项目流程

OCRmyPDF 进阶用法全解:unpaper 控制、OCR 引擎参数、光栅化/渲染器选择与 PDF/A 转换机制

【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF

本篇基于 OCRmyPDF 官方文档 docs/advanced.md 展开,系统讲解该工具的高级功能体系:如何精细控制 unpaper 图像清洗、如何选择 OCR 处理模式(skip/force/redo)、如何调整 Tesseract 的超时、下采样、配置参数与页面分割模式、如何切换 PDF 光栅化器与文字层渲染器,以及 PDF/A 转换的完整决策流程、Ghostscript 深度调优、退出码策略与临时文件调试方法。读完后你可以针对扫描件的特殊场景(双面扫描、超大图、混合内容文档、CJK 字体问题等)配置出真正可复现、可排错的 OCRmyPDF 命令。

一、精细控制 unpaper 清洗行为

OCRmyPDF 通过unpaper实现--clean--clean-final两个参数。unpaper 提供了一系列改善图像质量的前处理滤镜(对比度调整、去边框、倾斜校正等)。

默认策略偏保守:从源码 src/ocrmypdf/_exec/unpaper.py 可以看到,OCRmyPDF 在未收到自定义参数时,默认传给 unpaper 的是一组"安全"参数:

  • --layout none(不假设版面)
  • --mask-scan-size 100(不把窄列判为空白而涂掉)
  • --no-border-align--no-mask-center(不重排内容位置)
  • --no-grayfilter--no-blackfilter(不做灰度/黑块过滤)
  • --no-deskew(不做倾斜校正)

这样做的理由是:这些参数在几乎任何文件上都不会破坏内容,无需逐页检查。尤其在只使用--clean(仅在 OCR 前清洗图像、不清洗最终页面图像)时更为稳妥。

使用--unpaper-args覆盖默认参数:如果你希望使用更激进的 unpaper 选项,可以用--unpaper-args '...'覆盖 OCRmyPDF 的默认值并转发其他参数。注意以下几点:

  • 该选项不校验参数是否被 unpaper 认可,会原样转发;
  • 参数字符串必须像示例一样整体加引号;
  • 参数中不能包含文件名——OCRmyPDF 会自行在字符串末尾追加中间图像的输入/输出文件名;
  • 源码中该选项经过shlex拆分后做安全校验,任何包含/...的参数都会直接报错 "No filenames allowed in --unpaper-args"(见 src/ocrmypdf/_options.py)。运行层面还有三重防护:unpaper 的工作目录被设置为一个只含 unpaper 文件的临时目录、参数中禁用/、最后由 OCRmyPDF 追加绝对路径的输入/输出文件(见 src/ocrmypdf/_exec/unpaper.py),防止自定义参数意外覆盖其他文件。

双面扫描示例:当一页纸上扫描了书籍相对的两页时,可以告诉 unpaper 预期两个版面,它会分别对两半做倾斜校正并清理各自的页边:

ocrmypdf --clean --clean-final --unpaper-args '--layout double' input.pdf output.pdf ocrmypdf --clean --clean-final --unpaper-args '--layout double --no-noisefilter' input.pdf output.pdf

三条实用约束(文档原文警告与提示):

  1. 某些 unpaper 功能会重排图中文字位置,建议加--clean-final以避免最终图像与文字层错位;
  2. 某些 unpaper 功能会消耗或产生多个输入/输出文件,而 OCRmyPDF 要求 unpaper 严格"读一个文件、产出一个文件",不满足会报错;
  3. unpaper 的中间文件是未压缩的 PBM/PGM/PPM 格式,大图或大文档会占用大量临时磁盘空间。

从源码结构看,还有一个未在文档中明说的限制:图像宽高之积达到256 * 1024 * 1024像素时,OCRmyPDF 会跳过 unpaper 清洗(记录警告并返回原图),而不是让 unpaper 崩溃(见 src/ocrmypdf/_exec/unpaper.py)。

二、OCR 处理模式:--mode与页面文本的三种处置策略

2.1 统一的--mode参数

从 17.0.0 起,--mode-m)参数将 OCR 处理选项整合为单一入口,用于控制"已含文字的页面如何处理":

模式行为旧版等价参数
default发现文字即报错退出(不加参数)
force将所有内容光栅化并 OCR--force-ocr
skip跳过已有文字的页面--skip-text
redo剥离旧 OCR 层并重新 OCR--redo-ocr
# 跳过已经含有文字的页面 ocrmypdf --mode skip input.pdf output.pdf # 等价写法: ocrmypdf -m skip input.pdf output.pdf # 对所有页面强制 OCR(全部光栅化) ocrmypdf --mode force input.pdf output.pdf # 重新执行 OCR,替换旧的隐形文字层 ocrmypdf --mode redo input.pdf output.pdf

旧参数(--force-ocr--skip-text--redo-ocr)仍作为静默别名保留,保证向后兼容。

2.2 各模式的具体行为

默认模式(default):如果 PDF 某页似乎已有文字,OCRmyPDF 默认不修改文件并退出(对应退出码 6),以避免对"已 OCR 过"或"原生电子版"文档做无意义的处理。

--mode skip:对已有文字的页面不做任何图像处理或 OCR,页面直接复制到输出。适合包含"电子版 + 扫描件"混合内容的文档,或者纯粹想用 OCRmyPDF 做规范化/转 PDF/A 的场景。

--mode redo:执行细致的文本分析,将文字分类为可见与不可见(OCR 层)。剥离不可见文字后,把可见文字做遮蔽处理,生成每页图像送 OCR,再将新识别的文字作为 OCR 层插入。若文档混合了文字与含文字的图片,OCRmyPDF 能在不破坏既有文字的前提下补全图片中的文字。注意一个边界:某些 PDF OCR 工具通过"先绘制再涂盖"的方式让文字在技术上保持可打印/可见,OCRmyPDF 无法将其与真实文字区分,因此不会"重做"这类文字。

--mode force:所有页面全部光栅化为图像,丢弃隐藏 OCR 文字、把可打印文字渲染进图像,并将表单域或交互式对象压平为视觉呈现。适用于重做 OCR、修复字符映射损坏的 OCR 文字(文字可选但搜不到)、以及彻底销毁已编辑(redact)的信息。

2.3 Tagged PDF 与结构标记

一些 PDF 带有逻辑结构树(/StructTreeRoot),即所谓 "Tagged PDF" 的标记,通常来自版面分析或原生电子版导出。默认情况下 OCRmyPDF 将其视为"文档可能不需要 OCR"的信号而退出,与遇到已有文字的行为一致。源码中对应异常为 TaggedPDFError,提示可用--force-ocr--skip-text--redo-ocr覆盖。

若确需处理此类文件,使用--tagged-pdf-mode ignore,或--mode skip/redo/force之一。

关于结构树的保留与丢弃,文档给出了明确结论:

  • OCRmyPDF 无法根据新识别的文字重建结构树;
  • --force-ocr光栅化页面、或--redo-ocr剥离并重写文字层后,结构树与页面内容不再对应,会被丢弃
  • --mode skip不改动文字页,结构标记得以保留

注意--mode skip下结构树能保留的前提是输出未转 PDF/A。PDF/A 转换由 Ghostscript 完成,Ghostscript 10.x 在转换时会丢弃结构树(9.x 则保留)。由于默认的--output-type auto可能回落到 Ghostscript,若需要确保 Tagged PDF 的结构标记存活,请使用--output-type pdf。更优的做法是安装 veraPDF,让"推测式 PDF/A 转换"在大多数真实场景中绕过该问题。

三、超时与图像尺寸限制

每页 OCR 超时:默认允许 Tesseract 每页运行 3 分钟(180 秒)。超时后该页被跳过并以无 OCR 的方式插入输出;若请求了预处理,则插入预处理后的图像层。从源码看,超时(TimeoutExpired)会被捕获并生成一个空的 hOCR 文件使流程继续,同时打印 "[tesseract] took too long to OCR - skipping"(见 src/ocrmypdf/_exec/tesseract.py)。

调整超时与超大图跳过阈值:

# 允许 OCR 运行 300 秒;跳过大于 50 百万像素的页面 ocrmypdf --tesseract-timeout 300 --skip-big 50 bigfile.pdf output.pdf

参考值:300 DPI、8.5×11 英寸的页面图像约 8.4 百万像素。

超大图像的下采样:Tesseract 对可处理图像尺寸有内部上限。默认启用--tesseract-downsample-large-images,OCRmyPDF 会自动下采样图像以适配 Tesseract 的限制。这类上限通常只在扫描超大介质(超过 110 cm / 43 英寸且高 DPI 的大图、蓝图等)时才会遇到,可用--no-tesseract-downsample-large-images关闭该功能。

--tesseract-downsample-above Npixels调整触发下采样的阈值;默认只在超过 Tesseract 内部限制(任一边 32767 像素)时才下采样。处理超大图像时还需把--tesseract-timeout调得足够大。只有送 OCR 的副本会被下采样,原图保留不变

# 超大图像:允许 OCR 运行 600 秒 ocrmypdf --tesseract-timeout 600 \ --tesseract-downsample-large-images \ bigfile.pdf output.pdf # 最长边超过 5000 像素的图像下采样到 5000 像素 ocrmypdf --tesseract-timeout 120 \ --tesseract-downsample-large-images \ --tesseract-downsample-above 5000 \ bigfile.pdf output_downsampled_ocr.pdf

四、替换 Tesseract 与其他支持程序

4.1 替换 Tesseract 本体与相关环境变量

OCRmyPDF 在系统PATH中查找tesseract二进制。影响 Tesseract 行为的相关环境变量:

  • TESSDATA_PREFIX:覆盖 Tesseract 数据文件路径,可借此同时安装 "best" 与 "fast" 训练数据集。OCRmyPDF 不管理此变量。特别提醒:如果把TESSDATA_PREFIX指向手工拼装的tessdata目录(例如从 tessdata_best 下载的.traineddata),必须同时包含configs/子目录及其中的hocrtxt配置文件——OCRmyPDF 依赖这两个配置;缺失时 Tesseract 不产生任何输出。源码会把 Tesseract 的 "read_params_file: Can't open" 日志提升为明确的TesseractConfigError(退出码 9),并给出排查提示(见 src/ocrmypdf/_exec/tesseract.py)。
  • OMP_THREAD_LIMIT:控制 Tesseract 使用的线程数。若未预设,OCRmyPDF 会自行管理该环境变量——子进程调用时通过_tesseract_env()注入(见 src/ocrmypdf/_exec/tesseract.py)。

示例:使用开发版 Tesseract 而非系统安装:

env \ PATH=/home/user/src/tesseract/api:$PATH \ TESSDATA_PREFIX=/home/user/src/tesseract \ ocrmypdf input.pdf output.pdf

4.2 替换其他外部程序

除 Tesseract 外,OCRmyPDF 还依赖以下外部二进制:

  • gs(Ghostscript)
  • unpaper
  • pngquant
  • jbig2

它们均通过搜索PATH环境变量定位。修改PATH即可替换 OCRmyPDF 实际使用的任意一个程序。

五、修改 Tesseract 配置参数与页面分割模式

5.1 用配置文件覆盖 Tesseract 默认控制参数

Tesseract 的控制参数可以用配置文件覆盖。文档给出的示例是禁用当前语言的词典:词典通常有助于推断不清晰的词,但当文档中完整词很少(例如零件号列表)时反而干扰 OCR。

创建名为no-dict.cfg的文件,内容为:

load_system_dawg 0 language_model_penalty_non_dict_word 0 language_model_penalty_non_freq_dict_word 0

然后运行:

ocrmypdf --tesseract-config no-dict.cfg input.pdf output.pdf

警告:某些控制参数的组合会弄坏 Tesseract,或破坏 OCRmyPDF 对 Tesseract 输出的假设。

5.2 页面分割模式--tesseract-pagesegmode

--tesseract-pagesegmode Nmode把指定的页面分割模式(PSM)转发给 Tesseract,默认值为 3。当你知道 PDF 应当以特定方式分析时(例如页面只含单行文字),调整 PSM 可能改善结果;但对绝大多数用户,改变它只会让结果更差。

Tesseract 页面分割模式表(文档记载为 2024 年 6 月版本):

ID说明
0仅方向与脚本检测(OSD)
1自动页面分割 + OSD
2自动页面分割,不做 OSD 也不做 OCR(未实现)
3全自动页面分割,不做 OSD(默认)
4假设单栏可变大小的文字
5假设单块竖直对齐的均匀文字
6假设单块均匀文字
7把图像当作单行文字
8把图像当作单个词
9把图像当作圆圈中的单个词
10把图像当作单个字符
11稀疏文字,按任意顺序尽可能多地找文字
12稀疏文字 + OSD
13原始行。当作单行文字处理,绕开 Tesseract 特有的 hack

模式 0、1、2、12 与 OCRmyPDF 不兼容——它们都启用方向与脚本检测(OSD),而 OCRmyPDF 是在 OCR 之外的独立步骤执行 OSD 的。使用这些模式可能干扰--rotate-pages等功能。这一点可以从源码印证:OCRmyPDF 的方向检测以--psm 0单独调用 Tesseract(见 get_orientation),倾斜检测以--psm 2单独调用(见 get_deskew)。

另外,当前通过 OCRmyPDF 调用 Tesseract 时,尚无法使用 Tesseract 的高级 OCR 功能(如创建 OCR 信息)。

六、选择 PDF 光栅化器(Rasterizer)

术语:rasterizing(光栅化)——把 PDF 页面转换为图像,供 OCR 处理。

17.0.0 起,OCRmyPDF 支持两种 PDF 光栅化器:

光栅化器载体优点缺点
pypdfium2Python 包更快、版本问题更少需要安装 pypdfium2 包
Ghostscript系统二进制打包分发更普遍版本一致性问题、AGPLv3 许可限制

--rasterizer参数控制使用哪一个:

# 自动选择(默认)——pypdfium 可用时优先 ocrmypdf --rasterizer auto input.pdf output.pdf # 强制 pypdfium2 ocrmypdf --rasterizer pypdfium input.pdf output.pdf # 强制 Ghostscript ocrmypdf --rasterizer ghostscript input.pdf output.pdf

pypdfium2 是 pdfium(Google Chrome / Chromium 使用的 PDF 渲染库)的 Python 绑定,其输出通常与 Ghostscript 一致且性能更好。若未安装 pypdfium2 却指定了--rasterizer pypdfium,OCRmyPDF 会报错退出;安装方式为pip install pypdfium2。该检查实现在内置插件 src/ocrmypdf/builtin_plugins/pypdfium.py 中;从源码结构看,由于 pypdfium2 非线程安全,插件内部用锁串行化所有调用,以保证多线程 OCR 时的安全。

七、更换 PDF 渲染器(文字层生成器)

术语:rendering(渲染)——从其他数据(例如已有 PDF)创建新的 PDF。

OCRmyPDF 用 PDF 渲染器生成不可见的文字层,通过--pdf-renderer选择渲染器。默认auto会选择fpdf2(17.0.0 起 fpdf2 渲染器取代旧版 hOCR 渲染器成为默认)。

7.1fpdf2渲染器(默认,17.0.0 新增)

fpdf2 渲染器基于 fpdf2 库生成文字层,提供:

  • 完整多语言支持,包括 RTL 语言(阿拉伯语、希伯来语、波斯语);
  • 与 OCR 边界框对齐的精确文字定位;
  • 改进的 "Occulta" 无字形字体处理:零宽标记正确处理、双宽 CJK 字符尺寸正确;
  • 直接以 OcrElement 树作为输入,无需 hOCR 中间格式。

文档将其列为所有安装环境的推荐选择。注意:某些工作负载下 fpdf2 渲染器可能比旧版 hocrtransform 渲染器略慢,这是持续优化中的方向。

两种渲染器(fpdf2 与 sandwich)的共同原理:渲染一个纯文字层,将其"三明治"式地叠加到原始 PDF 页面之上,或叠加到原始页面的新光栅化版本之上(使用--mode force时)。这样可以避免 PDF 信息丢失;如需彻底消除有损变换,可能还需关闭 PDF/A 转换与优化。

7.2sandwich渲染器

sandwich 渲染器使用 Tesseract 的纯文字 PDF 功能,产生一个以隐形文字排布 OCR 结果的 PDF 页面(源码中对应generate_pdf(),以-c textonly_pdf=1调用 Tesseract,见 src/ocrmypdf/_exec/tesseract.py)。

已知问题:Mozilla PDF.js 与 macOS Preview 等阅读器对其文字切分有缺陷,可能把多个词连在一起;也不支持从右向左字体(阿拉伯语、希伯来语、波斯语);其输出不可编辑。该渲染器仅保留用于测试。当使用了--deskew等图像预处理时,原始 PDF 会被完整渲染成整页图像,OCR 层再覆盖其上。

7.3 旧版渲染器选项

hocrhocrdebug渲染器选项已弃用,会自动重定向到fpdf2,并将在未来版本移除。

八、软性渲染错误与颜色转换策略

8.1--continue-on-soft-render-error(14.3.0 新增)

当某个页面无法光栅化/渲染时,该选项允许 OCRmyPDF 继续处理。适用于对格式不佳的 PDF 尽可能榨取 OCR 结果的场景——代价是你必须接受部分页面可能与输入在视觉上不一致、OCR 质量也可能不佳。

8.2--color-conversion-strategy(15.0.0 新增)

OCRmyPDF 用 Ghostscript 做 PDF 转 PDF/A,某些情况需要颜色转换。默认策略为LeaveColorUnchanged:尽可能保留原始颜色空间(少数罕见的颜色空间仍可能被转换)。文档扫描仪通常产出 sRGB 的 PDF,无需转换,因此默认策略合适。

反例场景:文档以 Separation 或 CMYK 颜色空间为专业印刷准备,文字被转成了曲线路径。此时可以改用--color-conversion-strategy指定其他策略,例如RGB。从源码看,当 Ghostscript 报告 DeviceN 颜色空间且替代空间不当时会抛出ColorConversionNeededError,提示改用RGBCMYKGray之一,否则某些阅读器(如 Adobe Reader)中输出可能显示为空白(见 src/ocrmypdf/exceptions.py)。

九、Ghostscript 高级调优(17.5.0 新增)

OCRmyPDF 有意隐藏了大部分 Ghostscript 控制项,因为 Ghostscript 已是遗留代码路径:17+ 的推荐 PDF/A 管线使用 pypdfium2 光栅化器加 verapdf 校验推测式 PDF/A 输出,Ghostscript 仅作为"不经过它就无法合规"的 PDF 的回退手段。压缩输出 PDF 的受支持方式是 OCRmyPDF 自带的优化器(--optimize--jpeg-quality--png-quality等):它对不同输入文件结果一致,并把 Ghostscript 隔离开,让它专注于以尽可能少的图像变换产出 PDF/A。

以下两个选项仅供希望直接调优 Ghostscript 中间 PDF/A 输出的高级用户使用;对大多数用户,优化器给出更可预测的结果。

9.1--ghostscript-jpeg-quality Q

设置 Ghostscript 的-dJPEGQ开关,作用于 Ghostscript 在构建 PDF/A 时选择重新压缩为 JPEG 的图像。Q=0请求最大压缩,Q=100请求最高质量;省略该参数时 OCRmyPDF 传95(历史默认值)。它只影响 Ghostscript 实际转码的图像——在现代 Ghostscript 版本上,已有的 JPEG 原样通过。做端到端的 JPEG 质量调优请优先用--jpeg-quality(由 OCRmyPDF 优化器实现,独立于 Ghostscript 的决策)。

注意:同时设置--ghostscript-jpeg-quality--jpeg-quality可能导致 JPEG 双重重压缩(优化器可能重新编码 Ghostscript 已重压过的图像),以微妙方式损害质量。

9.2--ghostscript-jpeg-maxdpi DPI

启用 Ghostscript 的图像下采样,把彩色、灰度与单色图像的分辨率上限设为DPI。下采样阈值设为1.0,即有效 DPI 超过上限的图像都会被下采样。

文档明确建议:在相同压缩预算下,降低 JPEG 质量几乎总是比下采样更划算——400 DPI 的中低质量 JPEG 通常远比 200 DPI 的 JPEG 观感好,因为 JPEG 编码器可以把位"花"在关键处。下采样对"低分辨率彩色图 + 高分辨率单色蒙版"混合的 PDF 还有风险:限制蒙版分辨率会引入可见质量损失。因此除非确需强制硬 DPI 上限,应优先使用--jpeg-quality而非--ghostscript-jpeg-maxdpi

示例:

ocrmypdf --output-type pdfa \ --ghostscript-jpeg-quality 80 \ --ghostscript-jpeg-maxdpi 150 \ in.pdf out.pdf

这两个选项仅在 Ghostscript 被调起来做 PDF/A 转换时生效(--output-type pdfapdfa-1pdfa-2pdfa-3,或--output-type auto回落到 Ghostscript 时)。

十、PDF/A 输出模式与推测式转换

10.1--output-type各模式(17.0.0 起默认为auto

OCRmyPDF 可产出用于长期归档的 PDF/A 合规输出:

输出类型行为
auto尽力转 PDF/A,不强制依赖 Ghostscript(默认)
pdfa经 Ghostscript 转 PDF/A-2b
pdfa-1经 Ghostscript 转 PDF/A-1b
pdfa-2经 Ghostscript 转 PDF/A-2b(与pdfa相同)
pdfa-3经 Ghostscript 转 PDF/A-3b
pdf标准 PDF,不做 PDF/A 转换
none不生成输出文件(配合--sidecar使用)

10.2 非嵌入字体与 PDF/A(17.8.0)

PDF/A 要求所有字体嵌入。若输入已有使用非嵌入 CID 字体的文字层——最常见的是 Adobe Acrobat 生成的 CJK(中日韩)OCR 层,依赖阅读器系统字体——Ghostscript 必须替换并重新嵌入替代字体以满足 PDF/A。对 CID(CJK)字体,这一替换通常会破坏字符到 Unicode 的映射:页面看起来正确,文字却悄悄变成乱码或无法搜索。

从 17.8.0 起,OCRmyPDF 拒绝产出这种损坏结果,并检测到该情况后:

  • --output-type auto(默认):改为产出普通 PDF 而非 PDF/A,原样保留既有文字层;
  • 显式--output-type pdfa(或pdfa-1/pdfa-2/pdfa-3):直接报错停止。

源码中对应NonEmbeddedFontsError,错误信息会列出有问题的字体名并给出两条出路(见 src/ocrmypdf/exceptions.py):

  • 保留既有文字层 → 使用--output-type pdf
  • 仍要 PDF/A → 用--force-ocr重做 OCR,丢弃原文字层并用嵌入字体重建。

字体已嵌入的文字层照常转 PDF/A。

10.3 推测式 PDF/A 转换(17.0.0 新增)

使用--output-type auto(默认)时,OCRmyPDF 会先尝试一条避开 Ghostscript 的快速"推测式"转换:

  1. 用 pikepdf 添加 sRGB ICC profile 与 PDF/A XMP 元数据;
  2. 若有 verapdf,则校验结果;
  3. 校验通过则完全跳过 Ghostscript;
  4. 校验失败或无 verapdf 则回落到 Ghostscript。

该快速路径可避开部分 Ghostscript 限制(如图像转码),只要它能产出有效 PDF/A 就会被使用。当无法做到时(例如未安装 veraPDF,或输入确实需要实质性转换),auto回落到 Ghostscript,仍按默认产出 PDF/A,与 16 及更早版本的行为一致。若连 Ghostscript 也无法安全产出 PDF/A,auto输出普通 PDF 而非失败。

源码中该函数为 speculative_pdfa_conversion:创建输入 PDF 副本,添加 sRGB OutputIntent 与 PDF/A 一致性 XMP 元数据后保存。文档同时注明它不做颜色转换、字体嵌入等 Ghostscript 才做的实质变换。

10.4 PDF/A 转换决策流程

破坏性变更警告:若 Ghostscript 与 verapdf 都未安装,--output-type auto将产出标准 PDF 而非 PDF/A。这与早期版本"Ghostscript 必需、总是产出 PDF/A"的行为不同。

十一、返回码策略与标准流约定

OCRmyPDF 把所有消息写到stderrstdout保留用于管道输出文件,stdin保留用于管道输入文件。

退出码被视为稳定用户接口的一部分,可从ocrmypdf.exceptions导入(源码定义见 src/ocrmypdf/exceptions.py 的ExitCode枚举):

名称含义
0ExitCode.ok一切正常。
1ExitCode.bad_args参数无效,错误退出。
2ExitCode.input_file输入文件似乎不是有效 PDF。
3ExitCode.missing_dependency缺少 OCRmyPDF 需要的外部程序。
4ExitCode.invalid_output_pdf已生成输出文件,但似乎不是有效 PDF。文件仍然可用。
5ExitCode.file_access_error当前用户权限不足以读输入/写输出。
6ExitCode.already_done_ocr文件已似乎包含文字,可能无需 OCR。见输出消息。
7ExitCode.child_process_error外部程序(子进程)出错,OCRmyPDF 无法继续。
8ExitCode.encrypted_pdf输入 PDF 已加密。OCRmyPDF 不读取加密 PDF,请用 qpdf 等工具先解密。
9ExitCode.invalid_config通过--tesseract-config传给 Tesseract 的自定义配置文件被 Tesseract 拒绝。
10ExitCode.pdfa_conversion_failed有效 PDF 已生成,PDF/A 转换失败。文件仍可用。
15ExitCode.other_error其他错误。
130ExitCode.ctrl_c按 Ctrl+C 中断。

十二、修改临时存储位置

OCRmyPDF 处理过程中会生成大量临时文件。修改 OCRmyPDF 运行环境中的TMPDIR环境变量即可改变临时文件位置(Python 的tempfile.gettempdir()返回临时文件的根目录)。例如把TMPDIR指向一块大容量 RAM 盘,可避免对 HDD/SSD 的磨损并可能提升性能。Windows 上使用TEMP环境变量代替。

十三、调试中间文件:--keep-temporary-files

正常情况下 OCRmyPDF 把中间结果存到临时目录,退出时(无论成败)删除。加上--keep-temporary-files-k)参数后,临时目录会被保留并打印位置(无论成败),示例输出:

Temporary working files retained at: /tmp/ocrmypdf.io.u20wpz07

以 snap 方式启动时,对应 snap 文件系统内的路径,例如/tmp/snap-private-tmp/snap.ocrmypdf/tmp/ocrmypdf.io.u20wpz07

目录组织属于实现细节、可能随版本变化,但总体规则是:按页组织的工作文件以页码为前缀(从 1 开始),中段表示处理阶段,后缀表示文件类型。重要文件速查:

  • _rasterize.png—— 输入页面的光栅化样子;
  • _ocr.png—— 送 Tesseract 做 OCR 的文件,视参数可能与展示图像不同;
  • _pp_deskew.png—— 倾斜校正后的图像;
  • _pp_clean.png—— unpaper 清洗后的图像;
  • _ocr_hocr.pdf—— OCR 文件,表现为带隐形文字的空白页;
  • _ocr_hocr.txt—— OCR 文本(混合格式页面未必包含页上全部文字);
  • fix_docinfo.pdf—— 用于修复 PDF DocumentInfo 结构的临时文件;
  • graft_layers.pdf—— 已嫁接 OCR 层的渲染 PDF;
  • pdfa.pdf—— 转 PDF/A 后的graft_layers.pdf
  • pdfa.ps—— Ghostscript PDF/A 转换用的 PostScript 文件;
  • optimize.pdf/optimize.out.pdf—— 优化前 / 优化后的 PDF;
  • origin—— 输入文件;
  • origin.pdf—— 输入文件,或输入图像转成的 PDF;
  • images/*—— 优化过程中提取的图像,此处前缀是 PDF 对象 ID 而非页码。

小结

docs/advanced.md覆盖了 OCRmyPDF 从"能用"到"用好"的关键调节面:用--unpaper-args匹配特殊扫描件(双面、去噪)、用--mode三选一处理既有文字、用超时/下采样参数驯服超大图、用TESSDATA_PREFIX--tesseract-config定制识别行为、用--rasterizer--pdf-renderer选择底层实现、用--output-type auto的新决策树在"PDF/A 合规"与"保留原始信息"之间取得平衡。配合退出码策略与--keep-temporary-files,脚本化批处理和故障排查都有了明确抓手。所有参数行为均可在当前仓库的 src/ocrmypdf/_options.py、src/ocrmypdf/_exec/ 与 src/ocrmypdf/pdfa.py 中得到印证。

【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询