PDF文档复制粘贴乱码,如何解决
一直以来,经常会有人问我为什么PDF文档中的内容能看到,也能复制,但是粘贴就会乱码。
例如,一个红楼梦的样本文件,如果我打开文档之后,复制文本,粘贴到记事本,就会发现乱码

那么,是什么原因造成的乱码呢?我用AI分析这个文档,看一下字符是如何被渲染到页面上面的。
首先,我们用oPDF,看一下文档的内容流,你会看到类似的操作符

这段指令的意思是,使用C0_0字体,渲染0003字符到指定位置。AI分析结果如下:
<C0003> Tj
│
▼
/C0_0 (10 0 R) ──Type0字体──┐
│ │
├─ /Encoding /Identity-H → CID = 0x0003 = 3
│
└─ /DescendantFonts → (31 0 R) (字体类型:CIDFontType0)
│
├─ /CIDSystemInfo → Identity
│
└─ /FontDescriptor → (32 0 R)
│
└─ /FontFile3 → (20 0 R)
│
▼
┌───────────────┐
│ CFF数据流 │
│ │
│ CharStrings │
│ [0] .notdef │
│ [1] CID 1 │
│ [2] CID 2 │
│ [3] CID 3 ★ │ ← 字形轮廓数据在这里!
│ ... │
└───────────────┘
通过分析,我们知道了0003字符是从字体文件 /FontFile3 中读取字形,并渲染的。所以我们可以正确的看到这个字。
那么,为什么复制粘贴就乱码了呢?这就要提到一个字体中的概念----Unicode映射。字体文件的本质就是矢量绘图,而复制粘贴需要知道文字的Unicode码,把这个码放到剪贴板里面,其它的软件才会知道是什么字。正规的字体文件,都会带一个Unicode映射表,这个表会告诉软件字体中的第几个字对应的是Unicode中的哪一个字的编码。然后我们才能正确地复制粘贴。
所以,PDF文档为什么复制粘贴之后就会乱码的原因,想必你也清楚了。正是由于某些PDF文档在制作的时候,有意将Unicode映射表删掉了,造成我们无法得知复制的字对应的是Unicode的哪一个字,所以无法复制粘贴文档中的文本。这是一个很简单,也很有效的文档反拷贝手段。
为了解决这个问题,我写了一个软件PDFontFixer,采用OCR识别PDF文档中的字体里面的每一个字形,得到对应的Unicode编码,再将这些编码做成ToUnicode映射表,保存到PDF文档的字体里。这样,我们就可以正常复制粘贴文本了。

相关的软件和测试文档在蓝奏云下载,密码:73t8 。
因为韩国人的UI框架某些功能需要过一段时间才能完善,预计本软件会在下个月发布。
有问题可以与作者联系 QQ:564955427,Email:liucq@163.com

浙公网安备 33010602011771号