OCRmyPDF 扫描 PDF OCR 实战指南:从一键安装到批量归档
【免费下载链接】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 找一句违约条款,结果一个关键词都搜不到——因为那些字只是图片。这正是扫描 PDF OCR 要解决的痛点:OCRmyPDF 会往图片底下贴一层可搜索的文本,让扫描件从「只能看」变成「能搜、能选、能复制」。它默认产出符合 ISO 标准的 PDF/A,文本位置又贴得准,复制粘贴不会错位。说白了,它就是把「图片 PDF」升级成「真正能用的 PDF」。
30 秒快速上手 🚀
先按你的系统装一下。三个平台各一条命令,装完就能跑。
apt install ocrmypdf # Linux(Debian/Ubuntu) brew install ocrmypdf # macOS(Homebrew) pip install ocrmypdf # Windows:先备好 Tesseract 与 Ghostscript装好后,最小可用命令就长这样——输入一个文件,输出一个可搜索文件:
ocrmypdf input.pdf output.pdf跑完你会在终端看到进度条从 0% 爬到 100%,然后得到output.pdf。把它丢进任意 PDF 阅读器,文字就能选中、能搜索了。Windows 用户注意:因为 Ghostscript 现在不再支持静默安装,得先从官网手动装好它和 Tesseract,再用pip装本体。
一条命令背后发生了什么 🔍
你敲下一条命令,OCRmyPDF 内部大致做了这几件事:
- 读取与修复:用 pikepdf 打开输入文件,顺手把坏掉的 PDF 自动修好。
- 逐页分析:判断每页的颜色空间、DPI,挑出真正需要 OCR 的页。
- 栅格化:把页面渲染成图像,默认优先用 pypdfium2,缺省时回退 Ghostscript。
- 调用 Tesseract 识别:跑 OCR,拿到每个字的文本和坐标。
- 文本层回填:把识别结果精确铺回原图对应位置,保证可复制、不错位。
- 可选预处理:
--deskew、--clean之类在第 3 步之前生效,先把图修直修净。 - 合成存档格式:默认输出 PDF/A-2b,长期保存不跑偏。
- 校验输出:确认结果合法后写出文件。
一张典型的扫描文档输入,就是下面这种只有图像、没有文本的样式:
你可以试试加个--verbose,把上面每一步都打印出来看个明白:
ocrmypdf --verbose input.pdf output.pdf常用参数速查
高频参数按功能分四组,先记这几张表就够用了。
语言 & 预处理
| 参数 | 作用 | 一句话备注 |
|---|---|---|
-l, --language | 指定 OCR 语言 | 多语言用+连接,如-l eng+fra |
-r, --rotate-pages | 自动纠正方向错乱的页 | 扫描件歪 90° 很常见 |
-d, --deskew | 校正页面倾斜 | 提升识别率 |
--clean | 用 unpaper 清理图像噪声 | 需另装 unpaper |
输出
| 参数 | 作用 | 一句话备注 |
|---|---|---|
--output-type | 选输出格式 | 默认pdfa,可用pdf关掉存档 |
--sidecar | 额外导出纯文本 | 带-输出到标准输出 |
--optimize | 图像压缩档位 0–3 | 越高越小,档 2+ 用到 pngquant |
--force-ocr | 强制对已有文本的页重扫 | 原 OCR 失败时用 |
性能 & 调试
| 参数 | 作用 | 一句话备注 |
|---|---|---|
-j, --jobs | 指定并行核心数 | 默认吃满所有 CPU 核心 |
--skip-big | 跳过超大页面 | 防止内存爆掉 |
-v / -q | 详细 / 静默日志 | 排错用-v,批量用-q |
--redo-ocr | 剥掉旧文本层重扫 | 想换更强引擎时用 |
三条组合命令,直接抄:
# 中文文档(先装 chi_sim 语言包) ocrmypdf -l chi_sim 合同.pdf 合同.pdf # 多语言混合 ocrmypdf -l eng+fra 双语文档.pdf 双语文档.pdf # 批量归档(并行 2 个任务,原地处理) find . -name '*.pdf' | parallel --tag -j 2 ocrmypdf '{}' '{}'进阶技巧与组合玩法 🔧
sidecar 纯文本输出
不是所有场合都要 PDF,有时你只想要一段能喂给搜索或大模型的文本。--sidecar会在生成 PDF 的同时吐出一份.txt,配合--output-type none就纯出文本、不落 PDF。把 sidecar 设为-,文本直接走标准输出,方便管道串联。
ocrmypdf --sidecar - --output-type none 扫描件.pdf /dev/nullDocker 与 Paperless-ngx 集成
不想在本地装一堆依赖?官方 Docker 镜像把所有组件打包好了,而且支持把 PDF 从 stdin 读入、从 stdout 读出,彻底绕开文件权限问题。它也是 Paperless-ngx 这类文档管理系统背后做 OCR 的引擎,接进去就是「丢进去 → 自动识别 → 可检索」。详见 docs/docker.md。
docker run --rm -i jbarlow83/ocrmypdf-alpine \ --sidecar - - - < 扫描件.pdf > 文本.txt自定义预处理流水线与批量监控
批量场景不用手写循环,docs/batch.md 给了parallel与find的现成套路。更进一步,仓库里自带一个目录监控脚本 misc/watcher.py:盯着输入文件夹,有新 PDF 进来就自动 OCR、按月归档、把原件挪走。想接更多能力,它还提供OCR_JSON_SETTINGS环境变量,把任意参数以 JSON 塞进去即可。
find . -name '*.pdf' -printf '%p\n' -exec ocrmypdf '{}' '{}' \;除了命令行,它也是正经的 Python 库,参数集中在OcrOptions里做校验,调用示例见 src/ocrmypdf/_options.py:
import ocrmypdf from ocrmypdf import OcrOptions options = OcrOptions(input_file='in.pdf', output_file='out.pdf', deskew=True) ocrmypdf.ocr(options)踩坑与排查 ⚠️
报错 page already has text
症状:ERROR - 1: page already has text!。原因:文件里已经有文本层了。解法:确认它其实能搜就不用动;确实要重扫就加--force-ocr,只想跳过就--skip-text。
提示 is not a valid PDF
症状:Input file 'x' is not a valid PDF。原因:文件损坏或复制不完整。解法:用 Ghostscript 重写一遍gs -o out.pdf -dSAFER -sDEVICE=pdfwrite in.pdf。
Tesseract 打不开 config 'hocr'
症状:Tesseract cannot open its config file 'hocr'。原因:手动拼的tessdata目录缺configs/子目录。解法:从完整 Tesseract 安装里把configs/拷进去,或直接改用系统包管理器装。
中文识别出一堆乱码
症状:结果全是方框或错字。原因:没装对应语言包,或语言代码写错。解法:先apt-get install tesseract-ocr-chi-sim,再ocrmypdf -l chi_sim。
内存不够 / 处理大文件卡死
症状:页数多时进程被系统杀掉。原因:默认吃满核心,大图页面耗内存。解法:-j 2降并行,或--skip-big跳过大页。
下一步
回到开头那沓搜不到字的合同:现在给它跑一条ocrmypdf -l chi_sim 合同.pdf 合同.pdf,Ctrl+F 就能命中条款了。先拿一个文件试水,顺了再上parallel批量归档。
【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考