OCRmyPDF:让扫描PDF秒变可搜索文本的终极指南
【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF
一份 200 页的扫描合同没有文本层,Ctrl+F 搜不到条款,只能逐页人眼翻找。用免费的 OCRmyPDF 跑一遍,每页图像下被嵌入一层不可见文本,关键词搜索从翻页变成秒级响应;它默认多核并行处理,优化后的输出文件经常比输入还小。本文从一条命令开始,走到批量数字化和自动化集成。
30 秒了解 OCRmyPDF
一句话定位:OCRmyPDF 是纯 Python 的命令行工具,给扫描 PDF 叠加 OCR 文本层,原图像不动,新文本层可搜索、可复制。
- 文本精确对齐到字符位置,复制出来顺序不乱
- 默认输出并校验 PDF/A,专为长期存档设计
- 基于 Tesseract,支持 100+ 种语言,多语言混排一条命令
- 页面级任务默认分发给所有 CPU 核,千页文件稳定可跑
- 图像优化后输出体积常小于输入
快速上手
安装只展示一种方式:
pip install ocrmypdf还需两个外部依赖:Tesseract 4.1.1+ 和 Ghostscript。装完执行
ocrmypdf --version能打印版本即验证通过。
最简命令只需要输入输出两个文件名:
ocrmypdf <input_scan.pdf> <output_searchable.pdf>跑完你会看到逐页进度条,结尾一行提示输出文件已通过 PDF 校验。产物外观与原件一致,但在任何阅读器里 Ctrl+F 都能命中关键词;用选择工具划过文字,选中的是识别出的字符,而图像本身一个像素都没动。
核心能力拆解
多语言识别:一条 -l 指定语言包
OCRmyPDF 不自带语言包,先给 Tesseract 装好对应语言,再用-l传 ISO 代码:
ocrmypdf -l eng+chi_sim <mixed_doc.pdf> <mixed_doc_out.pdf>eng+chi_sim:多语言用加号拼接,一份文档同时识别- 语言包随系统安装,如 Ubuntu 上
apt install tesseract-ocr-chi-sim - 代码不确定时查 Tesseract 的 ISO 639-3 语言列表
效果:中英混排文档一次跑完,文本层同时包含两种文字,搜索任一侧都命中。
图像修复:识别前三个开关
扫描件歪斜、噪点、方向错,先修图再识别,识别率会明显上升:
ocrmypdf --deskew --clean --rotate-pages <skewed.pdf> <fixed.pdf>--deskew:自动检测并校正页面倾斜--clean:用 unpaper 去除噪点--rotate-pages:检测到文字侧放时旋转整页- 背景有污渍再加
--remove-background
注意:预处理会改变图像像素。原始件必须保真的场景(史料、证据材料)关掉这些开关,只叠加默认文本层。
批量转换:一条 find 扫完目录树
几十上百个文件,用并行批处理最省事:
find . -name '*.pdf' -print0 | parallel --tag -j 2 ocrmypdf '{}' '{}'parallel -j 2:同时跑两个 ocrmypdf 进程;每个进程自身已多核,2 是常用平衡点--tag:日志行前缀带文件名,报错时直接定位到具体文件- 输入输出同名即原地更新,失败不会覆盖原件
这条配方来自官方文档的批处理章节 docs/batch.md,Windows 上则可用for /r %%f in (*.pdf) do ocrmypdf %%f %%f。
场景配方
长期存档(合同、发票、无纸化档案):
ocrmypdf --deskew --output-type pdfa --optimize 3 <scan.pdf> <archive.pdf>先校正页面,再按 0–3 中最激进的--optimize 3压缩,输出 ISO 标准的 PDF/A,归档场景下文件往往比原件更小。
双语论文档案:
ocrmypdf -l eng+fra --force-ocr --jobs 4 <bilingual.pdf> <bilingual_out.pdf>--force-ocr让已有文本层的页面也被重新识别,适合原件带着劣质旧文本层、想整体替换的情况;--jobs 4显式固定并发核数,方便在共享机器上控制负载。
引擎室
核心处理链路分五步:
- 校验输入并自动修复 PDF,用 pikepdf 解析页面图像与既有文本
- Ghostscript 把每页栅格化为 PNG,保留原始分辨率
- 可选预处理:deskew、clean、rotate 依次作用于页面图像
- Tesseract 识别文字,生成带坐标信息的 hOCR 中间格式
- 文本层"三明治"嵌入到图像下方,压缩后输出 PDF/A,并对产物做最终校验
整条流水线实现在 src/ocrmypdf/_pipelines/,页级并发由--jobs调度。
问题速查
提示找不到 Tesseract 语言数据?
语言包没装。Ubuntu 执行apt install tesseract-ocr-fra(换成你的语言代码),再重跑即可。
说文件已有文本层就跳过了?
默认行为。加--force-ocr强制重新识别并替换旧文本层。
150dpi 的扫描件识别很差?
原始分辨率不够,加--oversample 600先按 600dpi 重新栅格化再识别,取值范围 0–5000。
大文件处理太慢?
确认--jobs吃满核心;多个文件用parallel -j 2并行;单进程内部已是页级多核,别再叠进程数。
输出比输入还大?
默认--optimize 1偏保守。存档用途改--optimize 3重跑,体积通常明显下降。
横向一瞥
| 维度 | OCRmyPDF | Tesseract 原生 | 在线 OCR 服务 |
|---|---|---|---|
| 文本层对齐可复制 | 精确对齐 | 需自行开发 | 视产品而定 |
| PDF/A 输出与校验 | 内置 | 无 | 无 |
| 批量 / 监听自动化 | parallel + watcher | 自行写脚本 | 无 |
| 费用 | 免费(MPL-2.0) | 免费 | 免费额度受限 |
两者并非竞争关系:OCRmyPDF 把 Tesseract 当作识别引擎,承担的是 PDF 这一端的修复、嵌入、优化与校验工作。
从单次用到集成
嵌入 Python 系统时用高层函数ocrmypdf.ocr:
from ocrmypdf import ocr, OcrOptions ocr(OcrOptions(input_file='in.pdf', output_file='out.pdf', languages=['eng']))实现见 src/ocrmypdf/api.py。要免手工干预,用仓库自带的 misc/watcher.py:设OCR_INPUT_DIRECTORY与OCR_OUTPUT_DIRECTORY环境变量,文件落入监控目录即自动处理,处理完还可归档原件。插件扩展(如更换 OCR 引擎)见 docs/plugins.md。
收束
扫描件不再是死档:一条命令换回可搜索、可存档的 PDF/A。装好它,把那堆压了半年的扫描目录跑一遍。
【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考