ARTICLE · 1062407
为什么从 PDF 里复制出来的字,总是断成一截一截的
平时经常跟 PDF 打交道的人,大概都吃过这种苦头。
从里面挑两段话拷出来,不管是发进微信还是贴进 Word,粘出来的全是一截一截的断行。

一句话被横着切成三四段,有些词直接断开,中间还冷不丁插进来一行「第 3 页 共 12 页」外加一截页眉。最后只能坐在那儿,光标挪到行尾,一下一下按退格键把回车删掉。
Word 复制出来好好的,网页选一段也是连贯的。偏偏到了 PDF 这里,看着排得整整齐齐,一粘出来全乱套了。
很多人第一反应是阅读器做得糙,其实翻到底层看,根本不是软件没做好适配。
PDF 这个格式在三十年前被设计出来的时候,文件里压根就没有「段落」这个概念。
甚至连「空格」,可能都是假的。
你如果用纯文本工具扒开一个没压缩的 PDF,找到画文字的那几行指令,大概长这样。
BT
/F1 12 Tf
72 712 Td
(Hello) Tj
ET
这段指令翻译成人话是:选 F1 这个字体,设成 12 号,把画笔挪到坐标(72, 712)的位置,把 Hello 几个字的轮廓印上去。
就是这样。
一整页 PDF,其实就是成百上千条画图指令。在坐标 A 画几个字符,跳到坐标 B 再印几个字符。至于哪些字连起来是一句话,哪儿是段落结尾,哪行是页眉页脚,文件里完全没有记录。

空格就更有意思了。
很多 PDF 里连空格字符(0x20)都没有。屏幕上两个单词之间的空隙,往往是排版引擎在两条指令中间,把横坐标 X 往右硬挪了几个像素。肉眼看着像空格,对文件来说只是两个字离得稍微远了点。
这就带来一个很尴尬的问题。
按下 Ctrl+C 的时候,阅读器拿到的根本没有语义上下文,眼里只有一块画满散落字符的二维坐标布。
它只能自己当侦探去猜。量一量字符间距算不算一个词,看看上下行间距算不算同一个段落,再猜猜最底下的小数字是不是页码。
最头疼的是换行。一行字排到右边缘折下来,阅读器根本分不清是作者故意按的回车,还是排版软件自动折过来的软换行。为了稳妥起见,大部分阅读器碰到这种视觉折行,干脆直接往剪贴板里塞个换行符 \n。
猜对了,贴出来的字勉强能看。猜不准,就是满屏莫名其妙的断行。

顺着这个讲,还有一个更抓狂的毛病。
有时候从中文 PDF 里拷文字,情况更离谱,粘出来的直接是一长串问号、方块,或者完全对不上的生僻字。
以前报销打印发票,或者下一些老论文的时候经常碰上。原因同样出在它的绘图机制上。
中文字体文件动辄几十兆,为了省体积,PDF 通常会做字体子集化。一份合同只用了四百个汉字,就只把这四百个字的字形轮廓塞进文件,按 1 到 400 重新排一套临时编号。
屏幕显示的时候,按编号去画轮廓,看着一切正常。但复制时,剪贴板需要知道 1 号轮廓到底对应哪个 Unicode 汉字。
要是生成工具图省事,漏写了映射对照表(ToUnicode CMap),阅读器就彻底抓瞎了。它画得出来字形,却根本不知道那叫什么字,只能扔给你一堆乱码。

看到这儿很多人可能会纳闷,当年设计这玩意的人,脑子怎么想的,为什么要把一个文档格式搞成一堆画笔坐标。
这就得回到 1991 年。
Adobe 联合创始人 John Warnock 当时启动了一个代号叫 Camelot 的项目,也就是后来 PDF 的前身。他想解决的问题在今天看来理所应当,但在当时却是个大麻烦。
九十年代初在不同电脑和打印机之间传文件,简直是一场灾难。一份排好的版面拷给别人,只要对方缺了个字体,版面直接散架,表格错位,打出来一看全乱了套。
Warnock 当时立下的目标是:一份文件,不管丢到哪台电脑、哪个系统、哪种打印机上,显示出来的样子必须分毫不差。

既然要绝对一致,最稳妥的办法就是直接把打印机的页面描述语言搬到屏幕上,不管语义,只记坐标。
PDF 从诞生的第一天起,就不是拿来给人编辑的文档,它其实就是一张塞进电脑里的数码复印纸。纸张是不需要理解文字含义的。你手里拿一张打印出来的劳动合同,纸不知道哪一行是你的名字,纸只管每个地方有没有落上油墨。
Adobe 后来也补过课。2001 年推出 PDF 1.4 时,专门加了带结构标签的 Tagged PDF 标准,允许标注段落和标题。
但现实是,直到今天大部分 PDF 依然不带标签。
因为大量软件导出 PDF,走的是系统虚拟打印。应用把内容交给打印驱动,驱动只管向虚拟打印机发送「在坐标多少画线、画字」,段落结构在变成打印指令的瞬间就已经丢光了。

今天大家都在用各类版面分析模型和提取工具清洗 PDF,折腾半天,其实是在帮三十年前那个为了「排版绝对不乱」而做出的工程取舍收拾残局。
搞明白这层关系,下回再遇到复制出来碎成渣的文字,也就不用跟阅读器较劲了。
人家当初费尽周折造出来的本就是一张印死在屏幕上的纸,只是我们总觉得只要能在屏幕上选中的字,就理所应当能顺顺当当地拷出来。