把扫描PDF变成可搜索文档:开源OCR工具完整指南
【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF
Ctrl+F搜不到东西?这就是扫描PDF的毛病
你手里有一份200页的扫描论文,想找个关键词,Ctrl+F 搜了半天,一个字都匹配不上。不是你没搜对,而是这份 PDF 里根本没有文字——每一页其实只是一张"看起来像文字"的图片。
OCRmyPDF 就是为这件事做的开源工具:它给扫描 PDF 做一遍光学字符识别(OCR),在原始图像下面垫一层真正的文本层,让文档变得可搜索、可复制、可粘贴。图像一个字都不会改,只是多了一个"影子"文本层。
5分钟跑通:三条命令入门
先装上它(三种任选其一):
pip install ocrmypdf # 通用方式,装好后可直接执行 ocrmypdf 命令最基础的转换,一条命令:
ocrmypdf scan.pdf searchable.pdf # 读入扫描PDF,输出带文本层的可搜索版本没有现成 PDF?图片也行:
ocrmypdf 扫描图.jpg 输出.pdf # 直接把JPG/PNG图片转成可搜索的OCR PDF想认中文或中英混排,加个语言参数:
ocrmypdf -l chi_sim+eng 双语文档.pdf 结果.pdf # 同时加载简中和英文识别模型跑完一条完整命令后,终端会像下面这样把每个阶段的进度条和最终优化率都打出来:
截图里能看到三件事:8 页并行处理、Tesseract 的警告提示、最后输出文件是 PDF/A-2B 格式。
幕后三步:输入、处理、输出
🔍 它的工作流拆开看只有三段,对应源码里的 src/ocrmypdf/_pipelines/ 模块。
第一步,把页面画成图。OCR 引擎只认图片不认 PDF,所以 OCRmyPDF 先分析每页的颜色空间和分辨率,再用栅格化器(pypdfium2 或 Ghostscript)把页面渲染成位图。
第二步,把图喂给 Tesseract。图像识别引擎逐页跑出文字内容,并给每段文字附上精确的坐标框。如果加了--deskew之类的预处理选项,还会先矫正倾斜再识别。
第三步,把文字贴回原文件。识别出的文本以透明方式覆盖在原始图像上,版式、字体、元数据原样保留。默认输出是 PDF/A-2B 归档格式——这是为长期保存设计的 ISO 标准子集,连美国法院都要求用这种格式存档扫描件。
三个真实场景,怎么用
扫描论文做OCR:先矫正倾斜再识别
- 问题:老论文扫描件页面歪斜、有噪点,直接识别准确率会打折扣。
- 命令:
ocrmypdf --deskew --clean-final 旧论文.pdf 可搜索论文.pdf # --deskew 自动测量并校正页面倾斜,--clean-final 去除识别前的噪点- 效果:倾斜被拉正后再识别,输出文本层与图像对齐,搜索和复制都能正常用。
下图就是典型的输入样本——一张打字机时代的扫描文档,正是这类"只有图没有字"的文件:
团队批量PDF处理:多线程并行
- 问题:档案部门一次收几百份扫描件,一份一份跑要等到天黑。
- 命令:
ocrmypdf --jobs 4 输入目录/ 输出目录/ # 4个并行工作进程,整目录批量处理- 效果:
--jobs让多核 CPU 同时干活,页数越多差距越明显,几百份文档挂上后台就能走开。
长期归档:一条命令转PDF/A
- 问题:企业归档的扫描件过几年打开可能缺字体、丢元数据。
- 命令:
ocrmypdf --title "2024年报" --author "财务部" 原始扫描件.pdf 归档版.pdf # 默认即PDF/A-2b,标题作者会写进文件元数据- 效果:字体、色彩配置文件全部内嵌进文件,不依赖任何外部资源,符合 ISO 长期存档标准,
--optimize 1还能顺手把体积压下来。
踩过的坑:这5种情况你多半也碰到过
输出文件比输入还大?大概率是 PDF/A 转换在起作用——归档格式必须内嵌字体等资源,文件必然变胖。只是临时用的话加
--output-type pdf输出普通 PDF 即可。警告 "lots of diacritics - possibly poor OCR"?这是 Tesseract 提示页面里带变音符的字符太多,常见于语言包没选对或扫描质量差。先核对
-l参数,再用ocrmypdf --list-languages看看本机到底装了哪些语言包。中文识别出来全是乱码?原因基本只有一个:没装
chi_sim语言包也没在-l里声明。装对应的 tesseract 语言包后把语言参数加进去,识别就正常了。想重新OCR一份已经有文字层的PDF?默认情况下 OCRmyPDF 会跳过已含文本的页面,这是防重复劳动的保护。确认要覆盖时加
--force-ocr强制重做。大文档跑得慢到怀疑人生?别干等,
--jobs 4让四个页并行处理;再配合--optimize 1边处理边压缩,慢和大这两个问题能同时缓解。
继续深挖:资源入口
- docs/cookbook.md:常见用法的配方合集,想看"某某操作该敲什么参数"先翻它。
- docs/advanced.md:高级调优项的说明,解决 Ghostscript 压缩、色彩管理等疑难杂症。
- src/ocrmypdf/api.py:Python 库接口入口,想把 OCR 流程嵌进自己的脚本或 Web 服务从这里入手。
【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考