Umi-OCR 双层PDF转换一文搞懂:如何把扫描件变成可搜索文档

【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库。 【免费下载链接】Umi-OCR 项目地址: https://gitcode.com/GitHub_Trending/um/Umi-OCR

你有没有遇到过这样的场景:收到一份扫描版合同,明明印刷得很清晰,却怎么也复制不了里面的文字;想检索一份电子书里的关键词,结果整本书像一张大图片,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 生成,主要由两大组件配合完成:

  1. PyMuPDF:负责 PDF 的解析与生成,也就是"画布"和"画笔"。
  2. 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 批量识别界面:左侧为文件列表与处理进度,右侧为设置面板

图:Umi-OCR 的批量处理界面,可同时导入多个文档,实时查看每页的识别进度与结果

③ 处理页眉页脚(可选但强烈建议)

扫描件最头疼的干扰源就是页眉、页脚和页码。点击"忽略区域",用鼠标框选页眉/页脚区域,这些区域内的文字会被自动排除在识别结果之外。如果文档有 200 页,你还可以指定忽略区域只作用于某些页范围,灵活度很高。

④ 启动任务

确认输出目录后点击"开始任务"。Umi-OCR 会先解析文档结构,再逐页执行 OCR。批量任务支持暂停和恢复,即使中途待机休眠,回来也能接着跑,不用担心前功尽弃。

⑤ 验证成果

任务完成后打开生成的 PDF,做三个测试:

  1. 搜索测试Ctrl+F 输入任意关键词,看能否定位;
  2. 复制测试:鼠标能否划选并复制文字;
  3. 观感测试:视觉上是否与原扫描件一致、文字有无错位。

Umi-OCR 截图识别界面:左侧为原图,右侧为识别出的文本层

图: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,此外还支持 txtcsvjsonl 等多种导出格式。这意味着你可以把 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 试试——你会发现,让旧文档"活"过来,原来这么简单。

进一步了解:

【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库。 【免费下载链接】Umi-OCR 项目地址: https://gitcode.com/GitHub_Trending/um/Umi-OCR

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐