.Convertor
菜单

PDF 复制乱码怎么修复?字体映射与 ToUnicode 原理

Loger

Loger

Oct 16, 2026 · 1 min read

PDF 复制乱码怎么修复?字体映射与 ToUnicode 原理

PDF 页面上的字明明正常,粘贴到记事本却成了另一串文字,先别急着换字体或做 OCR。这可能是“画出什么字”和“这个字代表什么字符”之间的映射出了问题。PDF 文本乱码修复需要先分清原因,才能避免改错地方。

为什么看得见,却复制不对?

PDF 的文字内容可以保存字体相关的源字符编码,而不是直接保存我们熟悉的 Unicode 文本。阅读器根据字体和编码信息找到字形,把它画在页面上;复制时,还需要把这些编码还原成有意义的字符。

因此,页面能够画出字母 A,并不保证提取出来也是 A。ToUnicode 是字体字典中的一种映射,用来把 PDF 源字符编码对应到 Unicode 字符序列。这种显示与提取的区别,见 Adobe PDF Reference 第 5.9 节。

同一 PDF 源编码分别用于显示字形和提取 Unicode 文本,错误的 ToUnicode 映射会让两者不一致

字体映射究竟指什么?

这三个概念有关联,但不能互换:

映射主要作用
字体文件内部的 cmap将字符编码映射到字体的字形索引;Unicode 子表使用 Unicode 编码
PDF 的 Encoding;复合字体可使用 Encoding CMap解释 PDF 源字符编码,参与定位要绘制的字形
PDF 的 ToUnicode将 PDF 源字符编码映射到可复制、可提取的 Unicode 文本

OpenType 的 cmap 规范讲的是第一类。本文介绍的修复针对第三类,不是重做字体文件或替换页面上的字形。

没有 ToUnicode 也不一定乱码。 阅读器有时能通过标准编码、已知字形名或字符集合恢复文字。反过来,映射表存在,也不代表其中的对应关系正确。

先判断是不是映射问题

先选一小段文字,复制到纯文本编辑器,再对照原页面:

现象优先检查什么
页面正常,复制后的字符稳定地变成其它字字符映射缺失或错误
只能选中图片,无法选中文字是否缺少文字层,或文字已转成轮廓;考虑源文件或 OCR
扫描页能选字,但文字与图片内容不符OCR 文字层的识别结果
单字正确,分栏或表格的顺序混乱阅读顺序与版面提取
页面本身就有缺字或方框字体资源、字形覆盖或显示编码

这些是排查线索,不是单凭现象就能下定论的诊断。字体是否嵌入与复制是否正确也不是一回事,可继续了解 PDF 字体嵌入与字体子集。

如何按原始字形校正复制文本?

假设某个字体的源编码 <0001> 显示为 A,却被错误映射为 错(U+9519)。下面只是演示用的映射片段,并非完整 CMap 文件:

Before: <0001> <9519>
After:  <0001> <0041>

<0001> 是这个字体中的 PDF 源编码,不是 Unicode 的 U+0001。把它映射到 U+0041,才是在说明“这个位置画出的字形代表 A”。连字(ligature,多个字母共用一个字形)也可能需要对应 fi 这样的多个 Unicode 字符。

确认适用后,可以使用 PDF 乱码修复工具:

  1. 选择 PDF,再选择需要校正的字体。
  2. 对照字形网格,在字形下方填写正确文本。
  3. 导出修复版 PDF,保留原文件供比较。

同一字体和源编码的修改会应用到全文。 不同字体即使同名,也应分别核对。若只是一处 OCR 把某个词识别错了,全局重映射可能把其它原本正确的文字一起改错。

怎样确认修复有效?

重新打开导出文件,在目标阅读器中复制和搜索样本文字;再核对其它使用相同编码的位置,以及没有修改的字体。对比页面外观,检查标点、连字和数字,别只验证第一次发现错误的那个字。

部分 PDF 还使用 ActualText 提供替代文本,支持它的软件可能优先采用这些内容。修改 ToUnicode 后仍不正确,应继续检查这种覆盖;当前工具会提示,但不会编辑 ActualText。其用途见 PDF Association 的说明。

如果问题来自 OCR,应该修正或重新识别文字层;如果有排版源文件,可优先修正源文件再导出。文件打不开或处理时报结构错误,则属于另一类问题,可参考 PDF 格式修复的适用范围。

确认是字体字符映射问题后,再用 本地 PDF 乱码修复工具校正。文件在浏览器内处理,无需上传;导出后的复制结果和页面外观仍要由你核对。

主题

PDF

PDF

已发布文章15

推荐阅读