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三条实用约束(文档原文警告与提示):
- 某些 unpaper 功能会重排图中文字位置,建议加
--clean-final以避免最终图像与文字层错位; - 某些 unpaper 功能会消耗或产生多个输入/输出文件,而 OCRmyPDF 要求 unpaper 严格"读一个文件、产出一个文件",不满足会报错;
- 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/子目录及其中的hocr和txt配置文件——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.pdf4.2 替换其他外部程序
除 Tesseract 外,OCRmyPDF 还依赖以下外部二进制:
gs(Ghostscript)unpaperpngquantjbig2
它们均通过搜索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 光栅化器:
| 光栅化器 | 载体 | 优点 | 缺点 |
|---|---|---|---|
| pypdfium2 | Python 包 | 更快、版本问题更少 | 需要安装 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.pdfpypdfium2 是 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 旧版渲染器选项
hocr与hocrdebug渲染器选项已弃用,会自动重定向到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,提示改用RGB、CMYK或Gray之一,否则某些阅读器(如 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 pdfa、pdfa-1、pdfa-2、pdfa-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 的快速"推测式"转换:
- 用 pikepdf 添加 sRGB ICC profile 与 PDF/A XMP 元数据;
- 若有 verapdf,则校验结果;
- 校验通过则完全跳过 Ghostscript;
- 校验失败或无 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 把所有消息写到stderr;stdout保留用于管道输出文件,stdin保留用于管道输入文件。
退出码被视为稳定用户接口的一部分,可从ocrmypdf.exceptions导入(源码定义见 src/ocrmypdf/exceptions.py 的ExitCode枚举):
| 码 | 名称 | 含义 |
|---|---|---|
| 0 | ExitCode.ok | 一切正常。 |
| 1 | ExitCode.bad_args | 参数无效,错误退出。 |
| 2 | ExitCode.input_file | 输入文件似乎不是有效 PDF。 |
| 3 | ExitCode.missing_dependency | 缺少 OCRmyPDF 需要的外部程序。 |
| 4 | ExitCode.invalid_output_pdf | 已生成输出文件,但似乎不是有效 PDF。文件仍然可用。 |
| 5 | ExitCode.file_access_error | 当前用户权限不足以读输入/写输出。 |
| 6 | ExitCode.already_done_ocr | 文件已似乎包含文字,可能无需 OCR。见输出消息。 |
| 7 | ExitCode.child_process_error | 外部程序(子进程)出错,OCRmyPDF 无法继续。 |
| 8 | ExitCode.encrypted_pdf | 输入 PDF 已加密。OCRmyPDF 不读取加密 PDF,请用 qpdf 等工具先解密。 |
| 9 | ExitCode.invalid_config | 通过--tesseract-config传给 Tesseract 的自定义配置文件被 Tesseract 拒绝。 |
| 10 | ExitCode.pdfa_conversion_failed | 有效 PDF 已生成,PDF/A 转换失败。文件仍可用。 |
| 15 | ExitCode.other_error | 其他错误。 |
| 130 | ExitCode.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),仅供参考