首页
/ 如何用 OCRmyPDF 为扫描版 PDF 添加可搜索的 OCR 文字层

如何用 OCRmyPDF 为扫描版 PDF 添加可搜索的 OCR 文字层

2026-09-09 12:39:02作者:廉皓灿Ida

扫描得到的 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
    

验证结果:确认文字层真的存在

判断“可搜索”是否达成,文档给出两条可操作的路径:

  1. 生成 sidecar 文本文件:加 --sidecar 参数,OCRmyPDF 会额外输出一个包含 OCR 识别文本的 .txt 文件,直接查看它就能核对识别结果:

    ocrmypdf --sidecar output.txt input.pdf output.pdf
    

    注意 sidecar 只包含 OCR 识别出的文本:原本就带文字层的页面、以及被 --pages 之外跳过的页不会出现在其中。

  2. 从输出 PDF 中提取文字:用 Poppler 的 pdftotextpdfgrepoutput.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.mddocs/introduction.md

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.76 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
860
1.35 K
docsdocs
暂无描述
Markdown
899
5.83 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
925
1.85 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.84 K
1.02 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
533
601
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.03 K
525
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.37 K
1.46 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
395