OCRmyPDF 离线OCR实战:3 类高频场景下的断网部署与批量调参路径
【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF
300 页扫描合同,客户明早要可检索版本,机房断网,云端 OCR 全部失效。OCRmyPDF 离线部署能解决这类问题:它在本机跑 Tesseract,给扫描 PDF 加一层可复制、可搜索的隐形文本层,处理完的文件通常比原件还小。
能力拆解:OCRmyPDF 离线部署到底覆盖了哪些环节
OCRmyPDF 是单进程 CLI,内部由四个能力簇组成,对应 4 类典型使用场景。当前发布版本 17.8.1,要求 Python 3.11+、Tesseract 4.1.1+,Ghostscript 9.54+ 自 17.0.0 起为可选(pypdfium2 可替代光栅化)。
- 识别引擎:
--language接 Tesseract 全部 100+ 语言代码,+号拼接多语言;--skip-big N按页像素数(百万像素)跳过超大图。什么时候用到:离线环境只预装了部分语言包、或页面上有印章照片等大区域干扰识别时。 - 预处理:
--deskew去歪斜、-r按文本方向自动旋转、--clean/--clean-final依赖 unpaper 去除扫描噪点、--oversample DPI提升低分辨率扫描。什么时候用到:低质量扫描件,文字倾斜、页边有黑边和阴影时。 - 输出控制:默认输出 PDF/A 存档格式(
--output-type可关);--optimize 0-3控制压缩激进度(3 会启用 JBIG2、pngquant、deflate);--title/--author等写元数据。什么时候用到:归档、合规存档、需要明显瘦身时。 - 并发与性能:页面级并行,
-j限核数,--pages分片,--max-image-mpixels(默认 250)防解压炸弹;光栅化优先走 pypdfium2(比 Ghostscript 快),多语言文本层由 fpdf2 + uharfbuzz 渲染。什么时候用到:多核机器批量跑、内存紧张时。
上图是实际跑完一份 15 页文档的终端输出:Start processing 8 pages concurrently、Image optimization ratio: 1.36 savings: 26.4%、Output file is a PDF/A-2B,三段信息分别对应并发、压缩、存档三类结果。
最小可行路径:断网机器上装通第一条命令
Linux 离线安装(Debian / Ubuntu 为例)
思路:联网机上把 deb 包全下齐,离线机dpkg -i一把装。
# 联网机执行:下载主包 + 语言包 apt-get download ocrmypdf tesseract-ocr-chi-sim拷贝.deb到离线机后:
# 离线机执行:--no-install-recommends 避免拉取无关推荐包,减少拷贝量 sudo dpkg -i ocrmypdf_*.deb tesseract-ocr-chi-sim_*.deb ocrmypdf --version若主包来自 PyPI 而非发行版(pip install ocrmypdf的 wheel),注意 wheel 只带 Python 依赖,Tesseract 二进制必须用发行版包解决——这是 OCRmyPDF 离线部署里最常见的依赖漏项。
语言包离线放置路径
语言包本质是.traineddata文件,Tesseract 从两个地方找:TESSDATA_PREFIX环境变量指向的目录,或系统默认路径(Debian 上通常是/usr/share/tesseract-ocr/*/tessdata)。
# 离线目录布局:configs/ 子目录必须随包携带,缺它 hocr 输出直接失败 # 详见下文"调参"一节 echo 'export TESSDATA_PREFIX=/opt/ocr/tessdata' >> ~/.bashrc tesseract --list-langs # 预期输出含 eng 和 chi_simWindows 离线安装(原生)
要求 64 位 Python 3.11+、64 位 Tesseract、64 位 Ghostscript,三者都有官方离线安装包。
winget install -e --id UB-Mannheim.TesseractOCR :: Ghostscript 10.01 起禁用静默安装参数,离线机上只能手动双击 msi py -m pip install ocrmypdf py -m ocrmypdf --version批量归档:一个目录的扫描件一次跑完
参考实现见仓库里的批量脚本:misc/batch.py。
mkdir -p /data/ocr_out for f in /data/scans/*.pdf; do ocrmypdf -j 8 --optimize 3 -i "$f" "/data/ocr_out/$(basename "$f")" done参数顺序上-j 8放前面只是可读性习惯,argparse 不敏感;--optimize 3激进度拉满,-i即--clean-final,要求装了 unpaper,它会把去噪后的图写进最终 PDF(--clean则只喂给 OCR、不改输出图)。预期输出尾部类似:Image optimization ratio: 1.36 savings: 26.4%、Total file size ratio: 2.16 savings: 53.8%,即输出比输入小一半以上——扫描件的 JPEG 压缩冗余被 deflate/JBIG2 吃掉是常态。
多语言混合文档:--language 的正确拼法
ocrmypdf --language eng+chi_sim mixed.pdf out.pdf预期正常跑完。若终端出现No installed font has glyphs for 'Ꮳ' U+13E3...一类警告,说明系统缺对应文字体系的 Noto 字体:Debian 上apt install fonts-noto,它只影响选中文字时的高亮外观,文本层本身仍可搜索、可复制——这条警告不致命,可以安全忽略。
--pages 分片处理大文件
--pages接受逗号分隔的页码与区间,end是末页别名:
# 内存告急时先分片,单段失败不牵连整本 ocrmypdf --pages 1-150 big.pdf part1.pdf ocrmypdf --pages 151-end big.pdf part2.pdf # 大像素页面直接跳过,防止 Tesseract 被 OOM killer 杀掉 ocrmypdf --skip-big 300 big.pdf out.pdf分片可并行执行,但总核数别超过物理核心(两段各-j 8在 8 核机上会互相挤占)。
调参与排错:5 个高频症状
1. 页面已有文本层,直接中止
- 症状:
page already has text! – aborting - 原因:输入已含可见文本或旧 OCR 隐形层
- 处理:按需求选
--mode skip(跳过文本页)、--mode redo(剥掉旧隐形层重跑)、--mode strip(只剥层不 OCR,体积更小)、--mode force(整页栅格化重识别)
2. Tesseract 打不开 hocr/txt 配置
- 症状:
Tesseract cannot open its config file 'hocr' - 原因:手工拼装的
tessdata目录缺configs/子目录(traineddata 下载仓库里不带它) - 处理:从完整 Tesseract 安装里拷
configs/进你的 tessdata 目录
3. 语言包放了但报找不到
- 症状:
Tesseract couldn't find a language data file - 原因:
TESSDATA_PREFIX没设置或指向了空目录 - 排查:
tesseract --list-langs
4. OCR 进程被杀
- 症状:Tesseract 子进程突然消失,任务中断
- 原因:内存不足触发 OOM killer
- 处理:
-j 1、--skip-big 200,必要时配合--pages分片
5. PDF/A 转换失败
- 症状:输出报错而非生成 PDF/A
- 原因:缺 Ghostscript 与 verapdf 二者之一
- 处理:临时改
--output-type pdf跳过转换,或补齐依赖
排查细节可对照仓库文档:docs/errors.md。
延伸与生态
- 插件机制:基于 pluggy,仓库内置 8 个插件(并发、优化、Tesseract 适配等),开发样例见 misc/example_plugin.py。
- 容器化:官方提供 Docker 镜像,安装方式见 docs/docker.md,断网机房可直接用镜像文件离线导入。
- CI/流水线集成:
ocrmypdf.ocr()是纯 Python 函数,可嵌入现有 ETL;用法见 docs/api.md。 - 核心处理逻辑:src/ocrmypdf/;CLI 参数定义:src/ocrmypdf/cli.py。
收束
适用边界:扫描件/影印件加可搜索文本层、批量归档瘦身、PDF/A 转换,OCRmyPDF 离线部署是成熟选择;若输入本身就是电子原生 PDF,或需要语义级理解(表格抽取、结构化数据),换专用工具更合适。
【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考