扫描PDF批量变可搜索:OCRmyPDF加文本层
【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF
那份 217 页的扫描版年报,Ctrl+F 输入任何词都搜不到,框选文字拖出来的是一行空白——整份文档在系统眼里就是一叠图片。OCRmyPDF 解决的就是这个:一个开源命令行工具,给扫描 PDF 批量加 OCR 文本层,处理完外观照旧,但能搜索、能复制了。
它到底在做什么
本质是一件事:逐页读出扫描件里的图片,交给 Tesseract 引擎识别文字,再把识别结果作为透明文本嵌回原页面底下。页面图片一个像素都不动,版式、注释、元数据原样保留。
它不做什么:不重排文档、不重压缩图片、不上传任何内容,全程本地跑。默认输出 PDF/A-2b——为长期存档设计的格式;只想要普通 PDF,加--output-type pdf就行。
最见功力的是这种老式打字机扫描件:
等宽字体、对比度又低,识别难度不小,但文本层只要和字形对得齐,整段复制出来照样干净。
最小可用路径
| 系统 | 安装命令 |
|---|---|
| Debian / Ubuntu | apt install ocrmypdf |
| macOS / Linux(Homebrew) | brew install ocrmypdf |
| 任意 Python 环境 | pip install ocrmypdf |
装完,第一条命令就这么短:
ocrmypdf 扫描年报.pdf 可搜索年报.pdf打开输出文件,拖拽选中第一段文字——能选中并复制出真实文字,说明文本层已经叠上了。原文件不会被改动,结果永远写进新文件;表里没有的系统(Docker、FreeBSD 等),仓库 docs 目录里有分步安装文档。
核心能力拆解
中文识别出来全是方框:语言包没装
症状:识别结果满屏方框,或者"可搜索"三个字只出来两个。
原因:OCRmyPDF 的识别全靠 Tesseract,能认哪些语言取决于装了多少 tessdata 语言包。默认只有英文,中文包没装就写不出中文字符。
sudo apt install tesseract-ocr-chi-sim ocrmypdf -l chi_sim 合同扫描件.pdf 合同可搜索.pdf英文中文混排写成-l eng+chi_sim,加号分隔。跑完打开输出,选中一句中文粘进记事本:是正常汉字就对了;还是方框,用tesseract --list-langs确认 chi_sim 在不在列表里。
页面横了倒了歪了:整页旋转和倾斜是两回事
整页转了 90°/180°,是--rotate-pages的活;整页只斜了几度,是--deskew的活。两者管的事不同,别指望一个开关解决所有方向问题,组合起来最稳:
ocrmypdf --rotate-pages --deskew 旧档案.pdf 旧档案_校正.pdf旧扫描件经常整页横着、倒着出来,像上面这种密排整页的文档也不例外。跑完翻几页:标题回到水平线、正文方向对了,就算过;还差一点就调--rotate-pages-threshold的判定阈值。
一批文件排队跑:多核并行
几十个文件手动一个个敲太累。其实就两层并行:单个文件内部--jobs开多核做 OCR,文件之间让 GNU Parallel 排队:
parallel --tag -j 2 ocrmypdf '{}' 'output/{}' ::: *.pdf一条命令把当前目录所有 PDF 写进 output 目录;--tag让日志行带上文件名,哪个文件失败一眼定位。
截图里是完整流程:扫描内容、逐页 OCR、PDF/A 转换、图像优化,进度条逐页刷新,最后给出压缩比。更多批处理写法见 docs/batch.md。
进阶技巧
⚡ 跑通之后才会想做的两件小事:
--oversample 300:扫描分辨率低、字迹发糊时,先把页面重采样到 300 DPI 再识别,准确率明显上来;前提是原件本身别太糊。--pages 1-100:几百页的大文件分段跑,内存不吃紧,还能先查前一百页的效果。
ocrmypdf --oversample 300 --pages 1-100 低清大文件.pdf 前百页_可搜索.pdf快速排错
| 现象 | 最可能原因 | 一条可复制的解法 |
|---|---|---|
| 中文全是方框 | 没装中文语言包 | sudo apt install tesseract-ocr-chi-sim,重跑时加-l chi_sim |
| 页面整体横或倒 | 扫描方向错了 90°/180° | ocrmypdf --rotate-pages 输入.pdf 输出.pdf |
| 整页轻微倾斜 | 扫描仪摆放歪了 | ocrmypdf --deskew 输入.pdf 输出.pdf |
| 大文件跑到一半内存告急 | 一次处理了全部页 | ocrmypdf --pages 1-100 输入.pdf 前百页.pdf分段跑 |
| 错字多且原图发糊 | 源扫描分辨率不足 | ocrmypdf --oversample 300 输入.pdf 输出.pdf |
| 想只要普通 PDF,不要存档格式 | 默认输出 PDF/A-2b | ocrmypdf --output-type pdf 输入.pdf 输出.pdf |
收尾
今天就能做:找一份手头的扫描件,装上 ocrmypdf,跑ocrmypdf 输入.pdf 输出.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),仅供参考