给扫描 PDF 加可搜索文本层:OCRmyPDF 实战指南
【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF
OCRmyPDF 是一个命令行工具,用 Tesseract 引擎给扫描 PDF 添加可搜索的 OCR 文本层,输出带文本层、可校验的 PDF/A 文件,原始图像内容保持不变。
场景很常见:你拿到一份 200 页的扫描版论文或合同扫描件,Ctrl+F 没有任何反应,想要检索三个关键词,只能一页页人工翻。
它是什么,解决什么问题
OCRmyPDF 做的事只有一件:把扫描图像上的文字识别成文本层,叠在原始图像下面,让 PDF 变得可搜索、可选择、可复制。
它不做的事同样明确:不识别手写体,不重排版面,不转成 Word 或 HTML,也不做文档问答。
典型痛点场景:
- 扫描件无法检索:整份文档只是图像,关键词搜索、全文索引全部失效
- 别家工具复制出来文字错行串行:文本层定位不准,多栏版式下复制粘贴基本不可用
- 归档有合规要求:需要长期保存且符合 ISO 标准的 PDF/A 格式
- 文档量大需要批量处理:几十上百份扫描件要靠脚本和并行跑批
截图中的Total file size ratio: 2.16 savings: 53.8%一行是输出文件相对输入的压缩比,Output file is a PDF/A-2b是校验结论
安装与首次运行
支持 Linux、macOS、Windows 和 FreeBSD,Docker 镜像也有。三种平台的安装命令:
| 平台 | 安装命令 |
|---|---|
| Linux(Debian / Ubuntu) | sudo apt install ocrmypdf |
| Linux(Fedora) | sudo dnf install ocrmypdf |
| macOS(Homebrew) | brew install ocrmypdf |
| Windows(winget) | winget install jbarlow83.ocrmypdf |
| Windows(Python 环境) | pipx install ocrmypdf |
安装完成后跑最简转换:
ocrmypdf 输入.pdf 输出.pdf输出里看到Done以及Output file is a PDF/A-2b即成功。再在 PDF 阅读器里选中一段文字复制出来,能粘出正确内容就算跑通。
核心能力拆解
文本层精确定位
OCR 结果按原文字坐标叠在图像下方,复制粘贴时文字顺序与版面一致。
ocrmypdf 输入.pdf 输出.pdf多栏报纸、带表格和脚注的文档最需要这一点——定位一旦错位,跨栏复制出来就是乱码式的串行文本。
多语言混排识别
默认识别英文(eng),支持 Tesseract 的 100 多种语言包,多个语言用+连接。
# 中文文档(Debian/Ubuntu 需先装语言包) sudo apt install tesseract-ocr-chi-sim ocrmypdf -l chi_sim 中文文档.pdf 输出.pdf # 英文法文混排,Tesseract 会逐页检测实际语言 ocrmypdf -l eng+fra 混合文档.pdf 输出.pdf适合处理外文文献、多语言混排档案,以及给中文扫描文档批量加文本层的用户;语言包安装方法见 语言文档。
扫描质量自动矫正
提供一组可选的图像预处理:--rotate-pages按文本方向自动旋转页面,--deskew校正整页倾斜,--clean去除扫描噪点和黑边,--remove-background去除灰色底色。
ocrmypdf -d --rotate-pages 倾斜扫描件.pdf 输出.pdf这些开关默认全部关闭,只在扫描件确实有旋转、倾斜、脏背景时开启——--clean与--remove-background处理过重的话可能误删正文,需要留意的用户先用小样验证。
输出压缩与自动校验
默认输出 PDF/A,归档友好;内置图像压缩会把大体积扫描件压小,输出文件通常比输入更小,截图中的示例压缩到了 46%。每份输出在保存前都会走一次 PDF 规范校验,校验失败时直接报出具体原因和页码,排错入口见 错误码文档。
# 不想要 PDF/A、尽量不动输入文件时 ocrmypdf --output-type pdf 输入.pdf 输出.pdf适合需要长期归档、或者对输出文件合法性有硬性要求的场景。
一个完整实战流程
拿一份荷兰语老式打字机文档(等宽字体、扫描件、略有倾斜)走一遍完整流程。
# 1. 安装识别语言包(Debian/Ubuntu;Windows 可用 winget install Tesseract.OCR,macOS 用 brew install tesseract-lang) sudo apt install tesseract-ocr-nld # 2. 主转换:校正倾斜,生成 PDF/A 输出,同时产出 sidecar 纯文本 ocrmypdf -l nld --deskew 输入.pdf 输出.pdf --sidecar # 3. 用 sidecar 文本快速核对识别质量(无需打开 PDF) head 输出.txt # 4. 质量确认后批量处理其余文档(misc/batch.py 会逐文件调用 ocrmypdf) python3 misc/batch.py -l nld --deskew 扫描件目录/*.pdf第 1 步装对语言包,避免整篇被当成英文识别;第 2 步用--deskew先校正倾斜再识别,能明显提高歪斜页面的识别率,--sidecar顺手产出可 grep 的纯文本;第 3 步是廉价的质量检查,确认Linzensoep这类关键词识别正确再往下走;第 4 步批量跑批,每份输入独立处理,单个文件失败不影响其他文件。
进阶参数与调优
提升识别率
| 参数 | 效果 | 适用条件 |
|---|---|---|
--oversample 400 | 先把低分辨率页面超采样到至少 400 DPI 再识别 | 扫描件清晰但偏糊、字小 |
-d/--deskew | 逐页检测并校正倾斜角度 | 扫描时页面没摆正 |
--image-dpi 300 | 输入是裸图片时声明其 DPI | 直接喂图片文件而非 PDF |
--clean | 去噪、去黑边后再识别,原图保留在输出里 | 有明显扫描瑕疵 |
提升速度
| 参数 | 效果 | 适用条件 |
|---|---|---|
-j 2 | 限制并行核心数(默认吃满所有核心) | 内存吃紧或机器在跑别的任务 |
-q | 静默模式,不打印 INFO 和进度条 | 跑批脚本、写进 cron |
--mode skip | 跳过已有文本层的页面,不重复 OCR | 文档里只有一部分是扫描件 |
输出控制
| 参数 | 效果 | 适用条件 |
|---|---|---|
--optimize 3 | 优化等级 0~5,等级越高压缩越强 | 想进一步减小体积,默认 3 |
--output-type pdf | 不强制 PDF/A,最小化改动 | 不需要归档合规 |
--sidecar 文本.txt | 额外输出与 OCR 层一致的纯文本 | 建全文索引、做质量抽检 |
常见问题
已有文本层的 PDF 会报错,怎么办
直接对"图像+旧文本层"的混合文档运行,默认模式会报错。按需三选一:
ocrmypdf --mode skip 混合.pdf 输出.pdf # 跳过已有文本的页,只 OCR 纯图像页 ocrmypdf --mode redo 混合.pdf 输出.pdf # 整页重做 OCR,替换旧文本层 ocrmypdf --mode strip 混合.pdf 输出.pdf # 只删掉旧的不透明文本层,不跑 OCR--mode skip是混合文档批量处理时的默认选择,速度最快。
识别错误多,怎么排查
按这个顺序试:
ocrmypdf -l eng --deskew --clean --oversample 400 输入.pdf 输出.pdf先确认语言包装对了(--deskew治倾斜,--clean治噪点和黑边,--oversample治低分辨率);再检查输出里的 warning,OCRmyPDF 会对识别置信度低的页面给出提示,见 错误码文档。
中文文档怎么处理
中文用chi_sim语言包(繁体是chi_tra),先装包再指定语言:
sudo apt install tesseract-ocr-chi-sim # Debian/Ubuntu;macOS 用 brew install tesseract-lang ocrmypdf -l chi_sim 中文扫描件.pdf 输出.pdfWindows 上可以winget install Tesseract.OCR装引擎,语言包用 Tesseract 安装包自带或从 tessdata 下载后放到安装目录的tessdata里。
适合谁,什么时候不用它
适合:手里有扫描版 PDF、图像 PDF,需要检索、复制文本、建索引的人;需要 PDF/A 归档、对接 Paperless-ngx 等文档管理系统的团队;以及想把 OCR 批量处理写进脚本或定时任务的用户。
不适合:文档已有文本层,直接搜索即可,没必要跑一遍 OCR;大量手写体内容——印刷体之外识别效果有限,不要拿它当手写识别工具;需要版面重排、转 Word/HTML 的需求,它只在原 PDF 上加一层文本。
核心价值就一句:扫描 PDF 进,可搜索的 PDF/A 出,文本层定位准、体积通常更小、每份输出都经过校验。建议先用一份 5 页的小文件跑通,复制出文字确认无误,再上批量。
【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考