跳转到内容
getnextpdf.com

PDF 简史

Spec: ISO 32000-1

PDF 始于一份关于某种困扰的备忘录:你可以在任何地方打印一份文档,却无法可靠地把它发送出去。本页讲述的,正是这个问题如何变成世界上使用最广泛的文档格式之一的简短故事——从 1993 年一个 PostScript 的衍生品,到一个最新版本已不再带有 Adobe 名号的 ISO 标准。

历史在这里不是怀旧。你今天制作的 PDF,充满了几十年前作出的决定,而其中大多数至今仍是承重的。零号对象是一个空闲列表的表头,其代数为 65535,只因为一份 1993 年的设计如此规定。页面用 PostScript 衍生的绘图运算符来描述自身,只因为这个格式脱胎于一种打印语言。知道一条规则从何而来,往往是理解它为何不能被简单忽略的最快途径。

另一个理由是视角。“PDF 2.0”听起来像是一次干净利落的重新发明。它不是。它是三十年沉积之上的最新一层,把它读作一种延续而不是一次重启,正是让你能够预测它行为方式的关键。

  • PDF 脱胎于 PostScript,Adobe 的页面描述语言。它保留了绘图模型,舍弃了完整的编程语言。
  • John Warnock 在 1991 年的内部 “Camelot” 备忘录框定了目标:一个任何人都能打开、且在任何地方看起来都一样的文件。
  • PDF 1.0 于 1993 年随 Acrobat 一起推出。在成为默认选择之前,它曾是一个付费的、小众的产品。
  • 1.1 到 1.7 各个版本,一份规范接着一份规范地,添加了那些让它变得不可或缺的东西——链接、加密、压缩、表单、透明度、标签化、数字签名。
  • 2008 年,PDF 1.7 成为了 ISO 32000-1:这个格式不再是 Adobe 的,而成为一个开放的国际标准。
  • PDF 2.0 就是 ISO 32000-2,第一个完全在 ISO 内部撰写并拥有的版本。它整合、收紧并移除的,多于它重新发明的。

NextPDF 把这条血脉当作一项真实的约束,而不是一段背景故事。它默认是一个 PDF 2.0 引擎,但这个格式更早的形态是有意可达的,因为建立在 PDF 之上的标准仍然需要它们。

时间线上那次决定性的断裂发生在 2008 年。在它之前,“PDF”意味着“无论 Adobe 最新规范怎么说”。在它之后,PDF 是一个 ISO 标准(Spec: ISO 32000-1),而这恰恰是为什么像本引擎这样的独立引擎能够存在,并能够依据一份公开文档而不是一家供应商的产品来主张符合性。当前的基准是 PDF 2.0(Spec: ISO 32000-2, Introduction),第一个完全在 ISO 内部撰写的版本。

那段历史解释了引擎中一个安静却重要的设计选择:PDF 版本是一个有意为之的决定,绝不是一次意外。NextPDF 默认写入 2.0 结构,但它仍然能够序列化更早的 1.7 与 1.4 文件形态——不是出于情怀,而是因为像 PDF/A 这样的符合性配置是依据那些更早的结构来定义的,并继续要求它们。过去并未被弃用。它是一个受支持的输出目标。

  1. PostScript (1984)Adobe ships a page-description language for laser printers — the drawing model the PDF inherits.
  2. Camelot memo (1991)John Warnock proposes a portable file anyone can open and that aims to render the same way everywhere.
  3. PDF 1.0 with Acrobat (1993)The format ships as a paid product. Adoption is slow; the readers and tools cost money.
  4. PDF 1.1 to 1.7 (1996 to 2006)Links, encryption, compression, forms, transparency, tagging, and signatures arrive one version at a time.
  5. ISO 32000-1 (2008)PDF 1.7 is adopted by ISO. The format becomes an open standard, no longer Adobe-owned.
  6. ISO 32000-2 / PDF 2.0 (2017, rev. 2020)The first ISO-authored edition: consolidation, tightening, and the baseline NextPDF writes by default.
The PDF's version lineage as a timeline: a PostScript spin-off becomes a paid product, accretes features across the 1.x line, is handed to ISO in 2008, and arrives at the ISO-owned 2.0 baseline NextPDF targets.

那条时间线上有几个细节值得停下来细想,因为它们解释了这个格式的性格。

它来自一种打印语言。 PostScript 能画出一台打印机所能画的任何东西,但它是一种完整的编程语言——一个 PostScript 文件可以永远循环下去。PDF 保留了 PostScript 的坐标系与图形运算符,并把可编程性扔掉了。剩下的是一份对一个成品页面的静态描述:可预测、有界、且可安全渲染。正是那次取舍,使得一个 PDF 页面在每一个阅读器上看起来都一样,也使得它不像一个 PostScript 文件实质上所是的那种微型应用程序。

免费的电子版采用是一个转折点。 PDF 1.0 是一个商业产品,而多年来这个格式都是一个付费的小玩意儿。突破在于让阅读器免费,同时创作工具仍然收费。一个只需要一方买单的格式,是一个人人都能接收的格式。等到规范走到 1.7 时,PDF 早已是发送一份在传输途中不得改变的文档的默认方式。

2008 年改变了规则的拥有者。 把 PDF 1.7 交给 ISO,使一份供应商规范变成了一个国际标准。那正是一个独立、符合规范的引擎之所以根本成为可能的时刻——有一份公开文档可供构建,且每一项行为都有一条公开条款。

你可以在一个文件的第一行里读到这整段历程。文件头是一个版本标记,它是这个格式中最古老、最简单的契约——1993 年就已存在,且形态至今未变。

%PDF-1.0 ← 1993, Acrobat 1.0
%PDF-1.4 ← 2001, transparency and the basis for PDF/A-1
%PDF-1.7 ← 2006, the version ISO adopted as 32000-1 in 2008
%PDF-2.0 ← ISO 32000-2, the first ISO-authored edition

同样的八个字节,相隔一代。一个现代阅读器可以打开这全部四个,因为这个格式的设计使得一个更旧的阅读器可以忽略它不理解的东西,而一个更新的阅读器则保持与先前内容的兼容。在实践中,一个更旧的阅读器可能反而会把一个未知特性渲染错,所以那份保证是一种设计意图,而不是一种绝对。NextPDF 默认写入其中的最后一个,并能在某个符合性配置要求时写入其他几个。

这里的陷阱,是把版本号读成一个戏剧性重新发明的故事——好像 PDF 2.0 之于 PDF 1.7,就如同一部续集之于一部电影。它更接近于一本长篇参考书一个用心打磨的新版本。一个 1993 年文件所用的对象模型、交叉引用表与尾部,可以辨认出与一个 2.0 文件所用的是同一套机制。三十年间所改变的大多数东西,是在原始设计旁边添加的,而不是被拆掉并替换。这个格式异乎寻常地保守,而那份保守正是全部要点:一个今天写下的文件,十年后理应仍能打开,而一个十年前写下的文件,今天理应仍能打开。

第二个误解是认为“ISO 32000-2 就是换了个封面的 Adobe 规范”。这两个 ISO 版本在著作权属上确实不同。PDF 2.0 是第一个在 ISO 流程内部产出、而不是由 Adobe 发布并事后批准的版本,这也是它读起来像是对几十年累积规则的一次整合、而不是一份供应商特性发布的部分原因。

本页是一个叙事性的入门导引,而不是一份精确的变更日志。日期给到年份,而“1.1 到 1.7”是有意把十多年的渐进式规范压缩成一行。如果你需要各版本之间精确到条款层级的差异,那是另一份文档。

Historical PDF versions as an output target — edition availability
EditionAvailability
Core

Core writes PDF 2.0 by default and can serialize the older 1.7 and 1.4 file structures when a profile requires them. It is a writer of these versions, not a museum: it does not promise to read, repair, or faithfully reconstruct an arbitrary legacy file produced by another tool decades ago.

ProAvailable
EnterpriseAvailable

NextPDF 是一个尊重自身血脉的 PDF 2.0 引擎;它不是一个为有史以来每一个 PDF 编纂史册的通用史官。这里所述的行为,描述的是它所写入的文件,锚定于它所针对的那些版本。那些文件内部如何构造,以及 2.0 具体改变了什么,都在下面的页面中涵盖。

PDF 一直都是免费阅读的吗? 不是。阅读器变成免费相对较早,但 PDF 1.0 是作为一个付费产品推出的。免费阅读、付费创作,正是让这个格式无处不在的那套模式。

PDF 2.0 是否破坏了与更旧文件的兼容性? 基本上没有。共享结构未变,而新特性的设计使得一个更旧的阅读器可以忽略它不识别的东西。一个 2.0 才有的特性通常不会被一个 1.7 阅读器尊重,后者可能跳过它,或者视特性与阅读器而定,作出并不完美的回退。

NextPDF 究竟为什么还要写入旧结构? 因为建立在 PDF 之上的符合性配置——尤其是某些 PDF/A 层级——是依据更旧的文件形态来定义的,并要求它们。过去是一个受支持的输出目标,而不是一个被弃用的目标。

  • PDF 究竟是什么——这段历史所产生的对象模型、交叉引用表与尾部。
  • PDF 2.0:有什么变化——1.7 与 2.0 基准之间精确到条款层级的差异。
  • 标准版图——ISO 32000 在 NextPDF 所跟踪的更广阔标准联盟中所处的位置。
  • 归档与 PDF/A——为什么这段历史中那些更旧的文件结构至今仍是必需的输出目标。
  • PostScript——Adobe 1984 年面向打印机的页面描述语言;一种完整的编程语言。PDF 继承了它的绘图模型,但舍弃了可编程性。
  • Camelot——内部项目代号,源自 John Warnock 1991 年的备忘录,指代后来成为 PDF 的那项努力。
  • PDF 1.0——第一份发布的 PDF 规范,1993 年随 Acrobat 一起推出。
  • ISO 32000-1——2008 年 ISO 对 PDF 1.7 的采纳;这个格式第一次成为一个开放的国际标准。
  • ISO 32000-2(PDF 2.0)——第一个完全在 ISO 内部撰写并拥有、而不是由 Adobe 发布的 PDF 版本。
  • 符合性配置——一个叠加在基础 PDF 之上的更严格标准(例如用于归档的 PDF/A),往往是依据一个特定的、有时更旧的文件结构来定义的。