PDF 页面上的字明明正常,粘贴到记事本却成了另一串文字,先别急着换字体或做 OCR。这可能是“画出什么字”和“这个字代表什么字符”之间的映射出了问题。PDF 文本乱码修复需要先分清原因,才能避免改错地方。
为什么看得见,却复制不对?
PDF 的文字内容可以保存字体相关的源字符编码,而不是直接保存我们熟悉的 Unicode 文本。阅读器根据字体和编码信息找到字形,把它画在页面上;复制时,还需要把这些编码还原成有意义的字符。
因此,页面能够画出字母 A,并不保证提取出来也是 A。ToUnicode 是字体字典中的一种映射,用来把 PDF 源字符编码对应到 Unicode 字符序列。这种显示与提取的区别,见 Adobe PDF Reference 第 5.9 节。

字体映射究竟指什么?
这三个概念有关联,但不能互换:
| 映射 | 主要作用 |
|---|---|
字体文件内部的 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 乱码修复工具:
- 选择 PDF,再选择需要校正的字体。
- 对照字形网格,在字形下方填写正确文本。
- 导出修复版 PDF,保留原文件供比较。
同一字体和源编码的修改会应用到全文。 不同字体即使同名,也应分别核对。若只是一处 OCR 把某个词识别错了,全局重映射可能把其它原本正确的文字一起改错。
怎样确认修复有效?
重新打开导出文件,在目标阅读器中复制和搜索样本文字;再核对其它使用相同编码的位置,以及没有修改的字体。对比页面外观,检查标点、连字和数字,别只验证第一次发现错误的那个字。
部分 PDF 还使用 ActualText 提供替代文本,支持它的软件可能优先采用这些内容。修改 ToUnicode 后仍不正确,应继续检查这种覆盖;当前工具会提示,但不会编辑 ActualText。其用途见 PDF Association 的说明。
如果问题来自 OCR,应该修正或重新识别文字层;如果有排版源文件,可优先修正源文件再导出。文件打不开或处理时报结构错误,则属于另一类问题,可参考 PDF 格式修复的适用范围。
确认是字体字符映射问题后,再用 本地 PDF 乱码修复工具校正。文件在浏览器内处理,无需上传;导出后的复制结果和页面外观仍要由你核对。


