如何用 OCRmyPDF 为扫描版 PDF 添加可搜索的 OCR 文字层
扫描得到的 PDF 往往只是逐页图像:文字无法选中、无法搜索、无法复制。OCRmyPDF 通过 OCR 识别图像中的文字,把识别结果作为一层文字“贴”回原 PDF,让扫描版文档变得可搜索、可复制粘贴。本文的任务就是:在一个已安装 OCRmyPDF 的 Linux/macOS/Windows 环境中,把 input.pdf 这样的扫描版文件处理成可搜索的输出文件,并能核对文字层是否真正生效。
OCRmyPDF 使用 Tesseract OCR 引擎做识别,默认输出经过校验的 PDF/A-2b 归档格式(见 docs/introduction.md)。
准备环境:安装并确认 OCRmyPDF 可用
OCRmyPDF 是 Python 程序,依赖外部程序(Tesseract、Ghostscript 等),必须通过系统包管理器或完整安装来满足,单独的 pip install 无法覆盖全部依赖。最低要求是 Python 3.11+、Tesseract 4.1.1+,以及 Ghostscript 9.54+ 或 Python 包 pypdfium2 二者之一(v17 起 Ghostscript 不再是硬性要求),详见 docs/installation.md。
各平台的一行安装命令:
# Debian / Ubuntu / WSL
apt install ocrmypdf
# Fedora
dnf install ocrmypdf tesseract-osd
# macOS 或 Linux(Homebrew)
brew install ocrmypdf
安装后运行内置帮助,确认命令可用:
ocrmypdf --help
Tesseract 默认自带英文语言包;处理其他语言时再按后文说明安装语言包。
执行 OCR:一条命令加上 OCR 文字层
主路径只有一条命令(见 docs/cookbook.md):
ocrmypdf input.pdf output.pdf
OCRmyPDF 会分析每一页所需的颜色空间和分辨率,把页面栅格化为图像、对图像执行 OCR,再把 OCR 文字层合并回原 PDF。与“先导出图像、识别后重新拼 PDF”的手动流程不同,这个方式对原文件的改动最小,能保留原有的分辨率、内容和元数据。
两个常用变体:
-
不想生成 PDF/A、只要普通 PDF 时,加
--output-type pdf:ocrmypdf --output-type pdf input.pdf output.pdf -
原地修改文件(输入和输出同名)。只有 OCRmyPDF 成功时才会覆盖原文件:
ocrmypdf myfile.pdf myfile.pdf
验证结果:确认文字层真的存在
判断“可搜索”是否达成,文档给出两条可操作的路径:
-
生成 sidecar 文本文件:加
--sidecar参数,OCRmyPDF 会额外输出一个包含 OCR 识别文本的.txt文件,直接查看它就能核对识别结果:ocrmypdf --sidecar output.txt input.pdf output.pdf注意 sidecar 只包含 OCR 识别出的文本:原本就带文字层的页面、以及被
--pages之外跳过的页不会出现在其中。 -
从输出 PDF 中提取文字:用 Poppler 的
pdftotext或pdfgrep对output.pdf提取/搜索文本。如果原扫描件没有文字层,而输出文件能提取出对应内容,说明 OCR 文字层已写入。此外,
--sidecar配合--output-type none并把输出文件名设为-时,可以不生成 PDF、只输出文本,适合快速试识别效果。
默认输出为 PDF/A 时,OCRmyPDF 会校验输出文件(README 中将其描述为 “validated PDF output”);若环境装有 verapdf,v17 起还会走先加 PDF/A 元数据、再用 verapdf 校验的转换路径,校验不通过才回落到 Ghostscript。
遇到已有文字或重做 OCR 的情况
对一份已经含可打印文字或隐藏 OCR 层的 PDF 直接运行 OCRmyPDF 会中止并报错:
ERROR - 1: page already has text! – aborting (use --force-ocr to force OCR)
文档给出的三个选项,按目的选择(见 docs/errors.md):
ocrmypdf --force-ocr input.pdf output.pdf:强制把所有内容栅格化后重新 OCR。适用于之前 OCR 失败或文档带文字水印的情况;代价是整页重建为图像,可能损失质量。ocrmypdf --skip-text input.pdf output.pdf(v17 起等价于--mode skip):跳过含文字的页面,这些页面原样复制进输出。ocrmypdf --redo-ocr input.pdf output.pdf(v17 起等价于--mode redo):移除文件里已有的非打印 OCR 层后重新识别,适合用新版 Tesseract 重做旧结果。此方式不栅格化、不降低质量;若文件混合了纯数字文本与 OCR 层,数字文本会被保留、只替换 OCR 部分。
可选分支:非英文文档与质量提升
非英文文档:Tesseract 无法自动检测语言,未指定时默认按英文识别,识别质量会变差。先安装对应语言包,再用 -l 指定三字母语言代码,例如 Debian/Ubuntu 上:
# 以简体中文为例:先安装语言包
apt-get install tesseract-ocr-chi-sim
# 识别时指定语言;多语言文档用 + 连接
ocrmypdf -l eng+fra Bilingual-English-French.pdf Bilingual-English-French.pdf
各平台安装语言包的方法见 docs/languages.md。
扫描质量一般的文档:识别前可做图像处理,选项可任意组合,执行顺序固定(rotate、remove background、deskew、clean):
# 页面横向倾斜(歪斜)时
ocrmypdf --deskew input.pdf output.pdf
# 页面朝向整体错误(横竖页混放)时
ocrmypdf --rotate-pages myfile.pdf myfile.pdf
# 组合使用
ocrmypdf --deskew --clean --rotate-pages input.pdf output.pdf
--deskew 处理“稍微歪了”的页面,--rotate-pages 处理“朝向角度错了”的页面。由于图像处理后可能移除不想要的内容,文档建议处理完后逐页查看输出文件。
限制
- OCR 准确性受限于 Tesseract:不能识别手写体;扫描质量差、语言未通过
-l指定、双栏排版等情况下识别效果会下降。 - Tesseract 只输出文字和包围盒,不区分段落或标题,生成的 PDF 不包含文档结构信息。
- 无法在保留数字签名的同时添加 OCR 层;默认会拒绝处理已签名的 PDF(可用
--invalidate-digital-signatures覆盖,但会使签名失效)。 - 无法打开用数字证书加密的文档。
处理完成后,用 pdftotext 提取输出文件中的文字、在 PDF 阅读器中选中/搜索文本,就是本文场景下的最终核对方式。更多参数(优化级别、页数范围 --pages、rasterizer 选择等)见 docs/cookbook.md 与 docs/introduction.md。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0631
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
video-shotcraftAI宣传片skill,使用 Remotion 制作电影级产品视频:提供106 张镜头配方卡和可复用的视频魔板。适用于 Claude Code 与 Codex以及所有其他智能体Markdown00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python09
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00