如何用 OCRmyPDF 为扫描版 PDF 添加可搜索的 OCR 文字层
【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF
扫描得到的 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 --helpTesseract 默认自带英文语言包;处理其他语言时再按后文说明安装语言包。
执行 OCR:一条命令加上 OCR 文字层
主路径只有一条命令(见 docs/cookbook.md):
ocrmypdf input.pdf output.pdfOCRmyPDF 会分析每一页所需的颜色空间和分辨率,把页面栅格化为图像、对图像执行 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。
【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考