RPA-Python与pytest-microsoft-teams-api集成:Microsoft Teams测试自动化终极指南
Umi-OCR 双层PDF转换一文搞懂:如何把扫描件变成可搜索文档
你有没有遇到过这样的场景:收到一份扫描版合同,明明印刷得很清晰,却怎么也复制不了里面的文字;想检索一份电子书里的关键词,结果整本书像一张大图片,Ctrl+F 完全失灵。这就是扫描版 PDF 的老大难问题——它本质上是"照片",不是"文档"。
Umi-OCR 是一款免费、开源、完全离线的 OCR 软件,它的双层PDF转换功能正是为了解决这个痛点而生:在保留扫描件原始画面的同时,给文档"叠"上一层可搜索、可复制的文本。本文将以"从一份扫描件到一份可搜索文档"为主线,带你搞懂它的原理、上手方法和进阶玩法。
第一步:先弄清楚扫描PDF为什么难搞
在接触任何工具之前,我们得先理解问题本身。PDF 大体分两种形态:
| 类型 | 里面装的是什么 | 能不能复制文字 | 能不能检索 |
|---|---|---|---|
| 电子版 PDF(原生PDF) | 文字编码 + 排版指令 | ✅ 可以 | ✅ 可以 |
| 扫描版 PDF(图像PDF) | 一张张高清图片 | ❌ 不行 | ❌ 不行 |
扫描版 PDF 的每一页都是一张照片。你在阅读器里看到的"文字",其实是照片里的像素。所以复制出来的是一团乱码,搜索更是无从谈起。
传统的解决办法是"OCR 提取文字"——用识别引擎把图片里的文字认出来,输出成 txt 或 docx。但这有个致命缺陷:原来的排版、图片、表格全部丢失。你得到一坨纯文本,还要手动重新排版,等于推倒重做。
于是行业里出现了第三个答案:双层PDF。它既保留原始画面,又内嵌识别文本,两全其美。
第二步:认识Umi-OCR的双层PDF"三明治"
如果说扫描版 PDF 是一块光秃秃的面包,那么双层 PDF 就是一块三明治:
┌─────────────────────────────┐
│ 顶层:透明文本层(可搜索复制)│ ← 肉片
├─────────────────────────────┤
│ 中间:坐标映射(文本↔图像) │ ← 酱料
├─────────────────────────────┤
│ 底层:原始扫描图像(视觉还原)│ ← 面包
└─────────────────────────────┘
- 底层图像:保持扫描件的原始模样,颜色、签章、折痕、图表一像素不少。
- 顶层文本:OCR 识别出的文字以透明方式写入页面,肉眼看不见,但阅读器能"摸"到。
- 坐标映射:文本按识别出的位置精准放置,让"看不见的文字"和"看得见的图像"严格对齐。
三层叠加,就得到了一个"看起来是扫描件、用起来是电子文档"的文件。Umi-OCR 从 v2.1.1 起持续迭代这一能力(详见 CHANGE_LOG.md),并在 v2.1.5 中修复了"无新文本写入"等边界问题,目前已经相当成熟。
第三步:原理拆解——双层PDF是怎么"长"出来的
Umi-OCR 的双层 PDF 生成,主要由两大组件配合完成:
- PyMuPDF:负责 PDF 的解析与生成,也就是"画布"和"画笔"。
- PaddleOCR:负责识别图像中的文字并返回坐标,也就是"眼睛"。
整个流程可以浓缩成一段极简伪代码:
def 生成双层pdf(输入文件, 输出文件):
for 页面 in 读取PDF(输入文件).pages:
# 1. 先解析出页面的原始图像
图像 = 提取页面图像(页面)
# 2. OCR 识别:拿到文字 + 每个字的坐标框
识别结果 = PaddleOCR.识别(图像)
# 3. 新建一页,先把图像铺满整页作为底层
新页 = 创建页面(宽=页面.宽, 高=页面.高)
新页.绘制图像(图像, 左上角(0,0), 右下角(页面.宽, 页面.高))
# 4. 再把文字按坐标写上去,设为透明不可见
for 文本块 in 识别结果:
新页.添加文本(文字=文本块.文字,
位置=文本块.坐标,
字号=文本块.字号,
透明度=0) # 透明层:看不见但可以搜索
保存(输出文件)
关键就在最后一步——透明度=0。这行参数是双层 PDF 的灵魂:文字以"隐形"状态嵌入,既不遮挡原图,又能被阅读器索引。而每个文字块的坐标、字号都来自 OCR 的原始输出,Umi-OCR 会额外做一次"文本块后处理",把同一行、同一段的文字按正确顺序合并,避免输出顺序错乱。
顺带一提,如果原始 PDF 本身自带文字(比如是"半电子版"文档),Umi-OCR 会直接提取原有文本而不是重复 OCR,既省时又保真。这也解释了为什么它的处理速度比"无脑全页 OCR"方案快得多。
第四步:实操——五步拿到可搜索PDF
理论讲完,下面进入实战。以 Umi-OCR v2.1.5 为例,整个操作都在"文档识别"标签页完成。
① 导入文件
打开软件,切到"文档识别"标签页,把 PDF 文件直接拖进窗口,或点击"添加文件"选择。它支持的格式不只是 PDF,还包括 epub、mobi、fb2、cbz、xps 等电子书格式——也就是说,一本没有文字层的电子书也能被"救活"成可搜索 PDF。
② 配置识别参数
在右侧设置面板中完成三件事:
- 保存格式选择"双层可搜索PDF"(也是默认值);
- 识别语言按文档内容勾选,中文文档选"简体中文",混合文档选"中文+英文",内置多国语言库可以随意组合;
- 提取模式保持默认的"优先提取原文,无原文再OCR",让软件自动判断。
图:Umi-OCR 的批量处理界面,可同时导入多个文档,实时查看每页的识别进度与结果
③ 处理页眉页脚(可选但强烈建议)
扫描件最头疼的干扰源就是页眉、页脚和页码。点击"忽略区域",用鼠标框选页眉/页脚区域,这些区域内的文字会被自动排除在识别结果之外。如果文档有 200 页,你还可以指定忽略区域只作用于某些页范围,灵活度很高。
④ 启动任务
确认输出目录后点击"开始任务"。Umi-OCR 会先解析文档结构,再逐页执行 OCR。批量任务支持暂停和恢复,即使中途待机休眠,回来也能接着跑,不用担心前功尽弃。
⑤ 验证成果
任务完成后打开生成的 PDF,做三个测试:
- 搜索测试:
Ctrl+F输入任意关键词,看能否定位; - 复制测试:鼠标能否划选并复制文字;
- 观感测试:视觉上是否与原扫描件一致、文字有无错位。
图:Umi-OCR 的识别结果展示,文字层与图像层的对应关系一目了然
第五步:进阶玩法——把双层PDF交给自动化
如果你的需求是"每天定时处理一堆扫描件",GUI 操作就略显繁琐了。Umi-OCR 提供了两条自动化通道,核心思路一致:上传文件 → 查询状态 → 下载结果。
HTTP 接口(文档见 docs/http/api_doc.md)是三段式调用,非常适合集成到自己的程序里:
// 1. 上传文档,得到任务ID
POST /api/doc/upload
{ "file": "合同扫描件.pdf" }
// 2. 轮询任务状态
POST /api/doc/result
{ "id": "任务ID", "is_data": true }
// 3. 任务成功后,生成并下载双层PDF
POST /api/doc/download
{ "id": "任务ID", "file_types": ["pdfLayered"] }
其中 pdfLayered 就是双层可搜索 PDF,此外还支持 txt、csv、jsonl 等多种导出格式。这意味着你可以把 Umi-OCR 嵌进自己的文档管理系统,实现"扫描入库即自动转双层 PDF"的全自动流水线。
命令行则更适合本地批处理场景,相关指令可参考 docs/README_CLI.md。如果你是开发者想二次开发,也可以通过 git clone https://gitcode.com/GitHub_Trending/um/Umi-OCR 获取源码,Python 侧的实现集中在 py_src/ocr/output/ 目录下。
第六步:按图索骥——常见问题排查清单
实操中遇到问题很正常,下面这张决策树可以帮你快速定位:
遇到问题?
│
├─ 生成的PDF文字错位、对不齐
│ ├─ 是否用了旧版本?→ 更新到 v2.1.5 及以上
│ └─ 个别歪斜页面?→ 可在识别前对图片做预处理
│
├─ 检索不到某些文字
│ ├─ 字体太小或太花?→ 提高扫描分辨率后重试
│ ├─ 被页眉页脚干扰?→ 重新设置忽略区域
│ └─ 语言选错?→ 确认识别语言包含目标语种
│
├─ 输出文件体积过大
│ ├─ 调整图像压缩质量(建议 70~85%)
│ └─ 原PDF分辨率过高?→ 可先整体压缩再转换
│
└─ 任务一直失败
├─ PDF加密或损坏?→ 先解除密码/修复文件
├─ 内存不足?→ 在全局设置中限制OCR引擎线程数
└─ 还是不行?→ 查看日志目录,把错误信息提交给开发者
一个实用建议:对于超过 500 页的超大文件,先拆分成若干 50 页左右的小文件分批转换,成功率更高,也方便定位出错的那一段。
它还能用在哪些地方
掌握了这套能力,你会发现双层 PDF 的适用面远比想象中广:
- 个人读书党:把扫描版电子书转成可搜索 PDF,做摘录、做批注、写论文引用都方便。
- 行政与档案管理:将历史纸质档案扫描归档为双层 PDF,实现全文检索,告别"翻箱倒柜"。
- 法律与财务:合同、发票、判决书转双层 PDF 后,用关键词秒级定位关键条款,签章画面完整保留,兼具法律效力与检索效率。
- 教育与科研:老教材、古籍、期刊扫描件转双层 PDF,学生可以划词搜索,研究者可以批量抽取语料。
写在最后
回到开头的那个场景:那份复制不了、搜不到的扫描合同,现在只需要拖进 Umi-OCR、点一下开始,几分钟后就能像普通电子文档一样自由检索和复制。整个过程完全离线,不涉及任何隐私上传,这正是 Umi-OCR 作为开源软件最让人安心的底色。
双层 PDF 的本质,是"图像的真实"与"文本的便捷"之间的和解。而 Umi-OCR 让这种和解从专业软件的门槛里走出来,变成任何人都能一键完成的普通操作。如果你手里恰好躺着几份"死图片"PDF,不妨现在就打开 Umi-OCR 试试——你会发现,让旧文档"活"过来,原来这么简单。
进一步了解:
- 更新日志与版本演进:CHANGE_LOG.md
- 命令行调用手册:docs/README_CLI.md
- HTTP 接口文档:docs/http/api_doc.md
更多推荐


所有评论(0)