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
需要在一堆扫描件里搜索关键词却一无所获时,OCRmyPDF 就是为此而生的命令行工具:它在本地为扫描 PDF 叠加 OCR 文本层,让文档可搜索、可复制、可粘贴。它基于 Tesseract 引擎支持 100 种以上语言,默认利用全部 CPU 核心并行处理,输出默认是验证通过的 PDF/A 归档格式。运行环境要求不苛刻:Python 3.11+、Tesseract 4.1.1+、Ghostscript,三者装齐即可开工。
三步出结果:拿到第一份可搜索PDF
先跑通,再谈参数。整个过程就是"输入 → 执行 → 输出":
# 输入:扫描版 PDF(只有图像、搜不到任何文字) ocrmypdf -l eng+chi_sim scan.pdf searchable.pdf # 输出:searchable.pdf —— 原文图像原样保留,文字可选中、可搜索对单张图片也成立:ocrmypdf photo.jpg out.pdf会直接生成带 OCR 层的单页 PDF。跑完后用pdftotext searchable.pdf -提取文本验证,能搜到原文里的词才算成功。默认行为已经覆盖了多数场景:OCR 文本以"不可见文本"方式贴在图像下方,不改动原始图像分辨率;处理过程中输入和输出文件都会经过合法性验证。
核心能力拆解:选参数前先看这四件事
哪些语言能识别,怎么指定
能识别什么语言完全取决于 Tesseract 语言包,OCRmyPDF 只负责调用。语言用 ISO 639-3 三位码表示:英文eng、法语fra、简体中文chi_sim、德文旧印刷体甚至有专门的deu_frak。多语言混排用加号串联即可:-l eng+chi_sim。注意两点:指定了哪几种语言,就必须提前装好对应语言包,否则会直接报错;Tesseract 本身不做语言检测,语言给错,识别率会明显下降——中文文档标成英文,结果基本不可用。
apt-cache search tesseract-ocr # 列出可装的语言包 apt-get install tesseract-ocr-chi-sim # 装简体中文包大文件和烂扫描件怎么扛
大文件不用整个吞下去:--pages 2,3,13-17只处理指定页,--pages 3-end处理从第 3 页到末页,对数千页的文件按段跑是最稳妥的做法。扫描件歪斜、方向颠倒则是预处理流水线的事,四个开关按需组合(顺序无关,内部固定按 rotate → 去背景 → 校正倾斜 → 清理 执行):
--rotate-pages:页面整页转错方向(横竖混扫)时纠正--deskew:页面整体倾斜几个角度时拉直--remove-background:灰度/彩色图的噪声背景--clean/--clean-final:用 unpaper 清理噪点,后者会改变最终图像,用后要逐页检查
对用户意味着什么:烂扫描件先过一遍--deskew --rotate-pages,比盲目重扫便宜得多;而--pages让你在内存有限时也能处理几百页的合同。
数据留在哪
全部处理在本地机器完成:OCR 由本机的 Tesseract 执行,没有中间环节把文档上传到任何服务器。输入输出双向验证(--output-type pdfa时由 veraPDF 校验归档合规性),这意味着"处理完成"这四个字本身就包含"文件是合法 PDF"的承诺。对涉密、内网、离线环境,这是它相对云端 OCR 服务的根本差别。
输出文件会不会更大
不会,往往反而更小。OCR 完成后有一道默认的无损图像优化;--optimize 3下,含大量图像的扫描件输出文件比输入小一半并不罕见——下图是一次真实运行:8 页并行 OCR,最终"Total file size ratio: 2.16, savings: 53.6%"。
高频场景实战:批量扫描、无人值守与归档
场景一:一个目录的扫描件一次处理完
几百份扫描 PDF 挨个敲命令不现实,官方推荐的搭配是 GNU Parallel。-j 2是关键:parallel 和 ocrmypdf 都想用满所有核心,限到 2 个并发任务正好不超载。
parallel --tag -j 2 ocrmypdf '{}' 'output/{}' ::: *.pdf--tag会在每行日志前打印文件名,哪份文件报错了立刻能对上号。递归处理整个目录树则换成find . -name '*.pdf' | parallel --tag -j 2 ocrmypdf '{}' '{}'。完整方案见 docs/batch.md。
场景二:扫描器一落文件就自动 OCR(无人值守)
团队场景:网络扫描仪把文件丢进共享目录,OCR 自动发生。仓库自带的watcher.py就是这个用途——指定输入/输出目录,文件落盘即处理,还可按年/月归档、成功后自动归档原件:
uv sync --extra watcher # 或 pip3 install ocrmypdf[watcher] OCR_INPUT_DIRECTORY=/mnt/in OCR_OUTPUT_DIRECTORY=/mnt/out \ python3 watcher.py不想装依赖就用 Docker:挂载/input、/output、/processed三个卷即可,OCR_DESKEW=1顺手校正歪斜。注意 watchmedo 在网络文件系统上可能失灵,输出目录也别放在输入目录下,否则无限循环。
场景三:旧文档长期归档
档案馆、财务、法务的共同需求:格式不腐化、体积可控、可长期检索。组合拳是 PDF/A 输出 + 最高优化级 + 倾斜校正:
ocrmypdf -l deu --rotate-pages --deskew \ --output-type pdfa --optimize 3 old_contract.pdf archive.pdf下面这份打字机扫描件的德文文档(linn.png同类的历史材料)就是典型输入——方向可能错、角度可能斜,预处理开关全部打开再进 OCR 最保险。
几组常用参数组合的效果差异,一张表说清:
| 场景 | 关键参数 | 代价 |
|---|---|---|
| 快速出结果 | --optimize 0 --output-type pdf | 不做优化与归档校验 |
| 默认平衡 | (不传参数) | PDF/A 输出 + 无损优化 |
| 最小体积归档 | --optimize 3 --output-type pdfa | 处理时间最长 |
| 烂扫描件 | --deskew --rotate-pages --clean | 图像被重采样,处理前先备份 |
调优与扩展:什么时候才需要它们
以下手段不是日常必需,按"卡在哪"对症取用。
速度优先时:默认行为里最耗时的是 PDF/A 转换和图像优化,两者都想要最快就关掉:--optimize 0 --output-type pdf --skip-big,再避开--force-ocr和图像预处理。什么时候用:批量跑几千页、先要结果再精修。
程序化集成时:跳过命令行直接用 Python API,参数是结构化传参而非拼字符串,适合嵌入自己的文档流水线:
import ocrmypdf ocrmypdf.ocr("scan.pdf", "out.pdf", languages=["eng", "chi_sim"])接口细节见 docs/api.md。
想换 OCR 引擎时:Tesseract 不是唯一选项,插件机制允许整体替换识别引擎(社区已有 EasyOCR、PaddleOCR、Apple Vision 插件),内置插件的写法可参考 src/ocrmypdf/builtin_plugins/ 中的tesseract_ocr.py。什么时候用:某类文档(如手写体、特殊字体)Tesseract 识别率不达标时,换引擎比调参数有效。
收束
- 一条命令完成:图像原样保留,文本层可选中可搜索,输出默认是验证过的 PDF/A
- 100+ 语言由 Tesseract 语言包决定,多语言用
-l eng+chi_sim式写法 --pages切段、--deskew --rotate-pages校正、--optimize 0~3控体积,三组参数覆盖绝大多数需求- 全部本地处理,配合 GNU Parallel 或 watcher.py 可做到批量与无人值守
- 处理成功后才覆盖文件,失败不会毁掉原件
打开终端,输入ocrmypdf --version——版本号能打出来,说明依赖齐全,找一个扫描件跑上面的三行命令吧。
【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考