主题
字号
CHAPTER 01 ≈ 22 MIN READ

纸的数字替身:PDF 的诞生

1.1 一切要从打印说起

1.1.1 1970s:Xerox PARC 和"所见即所得"的梦想

1970 年代,施乐公司在加州帕洛阿尔托的 PARC(Palo Alto Research Center)实验室里聚集了一批天才。这里后来产出了以太网、图形用户界面、激光打印机……几乎现代计算的所有基础都在这栋楼里被发明出来。

其中有一个看似朴素的问题困扰着所有人:屏幕上看到的东西和打印出来的东西对不上

今天你在 Word 里写一份文档,点"打印",出来的纸张和屏幕上基本一致。但在 1970 年代,这是不可能的。屏幕是像素网格(72 DPI),打印机用的是完全不同的指令集,中间没有统一的描述语言。你在屏幕上排好版,打印出来可能字体变了、位置移了、图表裂了。

这个问题有一个正式名称:WYSIWYG(What You See Is What You Get)——所见即所得。在当时,这还是一个未实现的理想。

1.1.2 John Warnock 和 Charles Geschke

故事的两位主角出场了。

John Warnock 和 Charles Geschke 都是 Xerox PARC 的研究员。Warnock 的博士论文研究的是图形的隐藏面消除算法(计算机图形学的基础问题),Geschke 领导着 PARC 的编程语言实验室。两人在 PARC 合作开发了一个叫 Interpress 的页面描述语言——它可以用统一的方式描述"一页纸上应该画什么"。

问题是:Xerox 的管理层完全不理解这东西的商业价值。Interpress 被束之高阁。

1982 年 12 月,两人一起离开 Xerox,创办了 Adobe Systems。创始资金来自风投,公司名字来自 Warnock 家后面的一条小溪——Adobe Creek。

他们带走的不是代码(那是 Xerox 的),而是一个核心思想:用一种设备无关的语言来描述页面内容。不管你的屏幕是什么分辨率、打印机是什么型号,同一份描述文件应该产生完全相同的视觉结果。

1.1.3 PostScript:打印的"编程语言"

1984 年,Adobe 发布了 PostScript

PostScript 不是一个文件格式,它是一门图灵完备的编程语言。是的,你没看错——你可以用 PostScript 写循环、做条件判断、定义函数。它只是恰好专精于"描述页面上的图形和文字"。

一段 PostScript 代码长这样:

%!PS-Adobe-3.0
/Helvetica findfont 24 scalefont setfont
100 700 moveto
(Hello, World!) show
0 0 0 setrgbcolor
newpath
100 600 moveto
400 600 lineto
400 650 lineto
100 650 lineto
closepath
fill
showpage

翻译成人话:找到 Helvetica 字体,放大到 24 磅,移动到坐标 (100, 700),画出 "Hello, World!" 这几个字。然后用黑色画一个矩形。完成,输出这一页。

为什么要设计成编程语言?

因为打印输出的复杂度远超你的想象。一页学术论文上可能有:正文(多种字体和字号)、数学公式(几百个特殊符号的精确定位)、图表(贝塞尔曲线、填充色、透明度)、页眉页脚、脚注……用固定格式描述这些东西会导致文件巨大且不灵活。用编程语言来描述,可以用循环画表格线、用函数定义常用元素、用变量控制全局参数。

PostScript 的真正商业突破来自 Apple。1985 年,Apple 的 LaserWriter 打印机内置了 PostScript 解释器——当时这台打印机售价 6,995 美元,其中一大块成本就是那个 PostScript 处理器。Steve Jobs 把它和 Macintosh 电脑配合,第一次让普通用户实现了桌面出版(Desktop Publishing)。

从此,设计师在 Mac 上用 Aldus PageMaker 排版,按下打印键,LaserWriter 的 PostScript 引擎把页面精确地输出在纸上——所见即所得,第一次真正实现了。

1.1.4 PostScript 的局限

但 PostScript 有一个严重问题:它太强大了

因为它是图灵完备的,一份 PostScript 文件理论上可能包含无限循环,解释器需要"执行"整个程序才能知道最终画面是什么。这意味着:

  1. 不能随机访问:你想看第 50 页,必须从第 1 页开始"执行"整个程序直到第 50 页——因为前面的代码可能定义了后面要用的变量和函数。
  2. 渲染速度不可预测:简单的页面秒出,复杂的页面可能跑几分钟。
  3. 文件不可检索:你没办法在一份 PostScript 文件里"搜索"某个词——因为文字可能是通过运算动态生成的。
  4. 安全隐患:一门编程语言意味着可以做很多你不希望它做的事情。

这些问题在"发给打印机"的场景下可以容忍——反正打印机就是从头到尾执行一遍。但到了 1990 年代初,人们开始想在屏幕上阅读文档,而不只是打印。这时 PostScript 的弱点就暴露无遗了:想快速翻到第 50 页?等着吧。


1.2 PDF 的诞生:Camelot 项目

1.2.1 1991:John Warnock 的备忘录

1991 年,John Warnock 写了一份内部备忘录,标题是《The Camelot Paper》。开头就说:

"设想这样一种能力:把任何来源的文档发送到任何地方,在接收端显示和打印时都能保持完全忠实的再现——不受任何显示设备或打印引擎特性的影响。"

这段话定义了 PDF 的全部使命:跨平台、跨设备、视觉完全一致

Warnock 把这个内部项目命名为"Camelot"。目标是创造一种新的文件格式——保留 PostScript 的精确页面描述能力,但去掉编程语言的部分,变成一个静态的、可随机访问的数据格式。tips

1.2.2 从编程语言到数据格式

PDF 和 PostScript 的关系,用一个比喻来说:

技术上,PDF 做了几个关键的设计决策:

  1. 去图灵完备化:PDF 不是编程语言。没有循环,没有条件分支,没有变量赋值。每一页都是独立的、确定性的描述。
  2. 页面独立性:每一页的渲染不依赖前面的页面。你可以直接跳到第 50 页,不需要处理前 49 页。
  3. 交叉引用表(xref):文件末尾有一张"目录",记录了每个对象在文件中的字节偏移。想找第 50 页?查表,直接跳到那个位置。
  4. 对象模型:所有内容(页面、字体、图片、元数据)都用编号的"对象"表示,通过引用互相关联。

这些设计让 PDF 获得了 PostScript 不具备的关键能力:快速随机访问。这对屏幕阅读来说是绝对必要的。

1.2.3 1993 年 6 月 15 日:PDF 1.0 发布

Adobe 在 1993 年正式发布了 PDF 1.0 和配套软件:

注意 Adobe 的商业模式设计:阅读免费,创建收费。这个策略后来被证明是天才级的决策——它让 PDF 格式以零摩擦在全世界扩散,同时 Adobe 通过卖"生产工具"赚钱。

但 PDF 1.0 的初始反应其实很冷淡。原因很多:

1.2.4 PDF 如何赢得世界

PDF 的真正普及是一个渐进过程,几个关键转折点:

1994 — 免费阅读器的分发策略

Adobe 把 Acrobat Reader 做成完全免费下载,甚至鼓励其他公司在光盘里附带。当时互联网还不普及,很多人是通过杂志附赠光盘第一次接触到 PDF 阅读器的。

1996 — 美国国税局(IRS)

IRS 开始用 PDF 发布税务表格。几亿美国人突然有了"必须能打开 PDF"的刚需。这是 PDF 进入主流的标志性事件——政府背书的力量是巨大的。

1999 — PDF 1.3,支持嵌入字体和透明度

这个版本让 PDF 真正满足了印刷行业的需求。设计师终于可以放心把 PDF 发给印刷厂,确信输出和自己看到的完全一致。

2001 — PDF 取代 PostScript 成为印刷行业标准

印刷业开始用 PDF/X(PDF 的印刷子集)替代 PostScript 作为交付格式。一个时代结束了。

2005 — Adobe Reader 7,免费且无处不在

此时 Adobe Reader 已经预装在几乎所有新电脑上。PDF 从"你可能需要安装阅读器"变成了"每台电脑都能打开"。

2008 — ISO 32000-1:PDF 成为国际标准

Adobe 把 PDF 1.7 规范交给了 ISO。从此 PDF 不再是 Adobe 的私有格式,而是一个开放的国际标准。任何人都可以免费获取规范、实现自己的 PDF 阅读器或生成器。


1.3 Adobe 帝国

1.3.1 不只是一个格式

理解 PDF 的历史,必须理解 Adobe 这家公司的商业逻辑。

Adobe 从来不只是"做 PDF 的那家公司"。他们的产品线覆盖了整个数字内容创作到输出的链条:

环节 产品 角色
图像创作 Photoshop、Illustrator 生产视觉素材
排版 InDesign 把素材组合成页面
文档管理 Acrobat 审阅、签名、表单
输出协议 PostScript → PDF 精确再现最终结果

Adobe 的生意本质是:控制从创意到最终呈现的每一个环节。PostScript 控制了打印输出,PDF 控制了电子文档分发。他们的护城河不是某一个产品,而是整个工作流的锁定——你在 Photoshop 里修图、在 InDesign 里排版、用 Acrobat 交付,全程不离开 Adobe 生态。

1.3.2 格式标准背后的商业博弈

Adobe 在 2008 年把 PDF 标准化给 ISO,看似"大公无私",实际是精心计算过的:

  1. 消除竞争的借口:如果 PDF 是 Adobe 私有格式,竞争对手(Microsoft 的 XPS、开源社区的 ODF)就有理由推广替代格式。标准化后,这些替代品失去了"开放性"的攻击角度。
  2. 护城河不在格式本身:Adobe 的利润来自 Acrobat Pro(售价 449 美元的专业版)和 Creative Cloud 订阅,不是来自格式的私有性。格式开放了,但生产高质量 PDF 的最好工具依然是 Adobe 的。
  3. 规范复杂度就是壁垒:PDF 1.7 的 ISO 规范有 756 页。完整实现一个符合标准的 PDF 渲染引擎需要数年工程投入。"开放"不等于"容易做"。

1.3.3 从买断到订阅

2013 年,Adobe 全面转向 Creative Cloud 订阅制。Acrobat 从一次性购买变成月费制。这个商业模式转变引发了巨大争议,但从商业角度是极其成功的——Adobe 的年收入从 2012 年的 43 亿美元增长到 2024 年的 215 亿美元。

对用户来说,这意味着"编辑 PDF"这件事变成了每月 22.99 美元的持续支出。这也是为什么市场上出现了大量替代品(Foxit、Smallpdf、各种在线工具)——但没有一个能完全匹配 Acrobat 的功能完整度。


1.4 PDF 的竞争者们(以及他们为什么输了)

1.4.1 DjVu:比 PDF 更早优化扫描文档

DjVu(发音 "déjà vu")是 AT&T 实验室在 1996 年发明的格式,专门针对扫描文档优化。它的压缩算法极其出色——同样的扫描页面,DjVu 文件通常只有 PDF 的 1/5 到 1/10 大小。

DjVu 的核心思想是把每一页拆成三层:

这种分层压缩方式让扫描文档既清晰又小巧。在学术文献下载网站(如某些影子图书馆)上,DjVu 至今仍被广泛使用。

但 DjVu 输给 PDF 的原因很简单:生态。Adobe 几乎在每台电脑上预装了免费的 PDF 阅读器,而打开 DjVu 需要额外安装软件。技术上更优不代表生态上能赢。

1.4.2 XPS:微软的尝试

2006 年,微软随 Windows Vista 推出了 XPS(XML Paper Specification)。它基于 XML 和 ZIP,结构比 PDF 更现代、更容易解析。

XPS 的技术设计其实相当不错——XML 描述的页面结构比 PDF 的二进制对象清晰得多,字体嵌入和颜色管理也考虑得很周全。但它犯了一个致命错误:来得太晚了

到 2006 年,PDF 已经是事实标准。全世界的政府、企业、学术机构都在用 PDF 交换文件。没有人愿意为一个功能相似的新格式重新建设工具链。XPS 在 Windows 10 中已经被边缘化,到 Windows 11 基本名存实亡。

1.4.3 HTML:Web 时代的"反 PDF"

有一种论调认为"HTML 才是文档的未来"——响应式、可搜索、天然跨平台。

但 HTML 和 PDF 解决的是根本不同的问题:

维度 PDF HTML
核心承诺 所有人看到的完全一样 内容适配不同设备
布局模型 固定尺寸页面(A4/Letter) 流式布局(宽度自适应)
离线使用 单文件,完全独立 依赖外部资源(CSS/JS/图片)
打印输出 精确到 0.01mm 需要额外的打印样式表
法律/存档 数字签名、不可篡改 动态内容,不保证不变

PDF 的核心价值是"视觉保真"——你发给对方一份 PDF,不管他在什么设备上打开,看到的排版和你完全一样。HTML 做不到这一点,也不打算做到这一点。

这就是为什么合同、论文、发票、官方文件依然是 PDF——在这些场景中,"每个人看到完全相同的内容"不是可选的,是强制要求。


1.5 PDF 版本演进一览

版本 年份 关键特性
1.0 1993 基础功能:文字、图形、图片
1.1 1994 密码保护、外部链接
1.2 1996 交互式表单(AcroForm)
1.3 1999 嵌入字体子集、透明度、JavaScript
1.4 2001 JBIG2 压缩、标记内容(Tagged PDF)
1.5 2003 对象流、交叉引用流(文件更小)
1.6 2004 嵌入 3D 内容(U3D)、AES 加密
1.7 2006 XFA 表单、增强的注释 → 2008 成为 ISO 32000
2.0 2017 移除过时特性、改进加密、更严格的规范

三十年,从一个简单的"电子纸"进化成一个功能庞大、向后兼容三十年历史包袱的复杂系统。后面的章节会让你看到这些复杂性到底意味着什么。