跳转到内容

PDF 2.0:有什么变化

Evidence: Standard-backed

PDF 2.0 就是 ISO 32000-2。它是第一份完全归 ISO(而非 Adobe)所有的 PDF 规范。它主要是对 1.7 的整合与清理,而不是彻底重塑。本页说明实际发生了哪些变化、哪些变化会在实践中影响你,以及 NextPDF 如何默认以 2.0 为基准,同时在配置文件要求时仍能写出较旧的文件结构。

「PDF 2.0」听起来像是一种截然不同的格式。其实并非如此。2.0 文件使用与 1.7 相同的对象模型、xref 与 trailer,这让人容易低估真正的变化。真正会造成问题的变化,并不是那些醒目的功能,而是那些收紧的规则:在 1.7 中属于选用、如今却被预期遵守的规则,以及被悄悄移除的功能。一份原本完全有效的 1.7 文件,可能在没有任何可见差异的情况下,成为不符合 2.0 规范的文件。

这件事重要的另一个原因是演进方向。NextPDF 是一套 PDF 2.0 引擎。一旦你了解 2.0 的预期要求,以及它刻意区别于 1.7 的地方,就能理解为什么引擎会拒绝某些做法、更严格地要求嵌入字体,并默认使用交叉引用流而非表格。

  • PDF 2.0 = ISO 32000-2,由 ISO 持有,建立在 1.7 之上(而不是取代它)。
  • 文件头变为 %PDF-2.0;符合规范的写入器会在文件头目录 /Version 中将版本标示为 2.0。
  • 大部分文件结构保持不变——相同的间接对象、相同的 trailer、相同的 startxref/%%EOF 规范。
  • 交叉引用是顺理成章的 2.0 默认选择;经典的 20 字节表格仍然合法,且某些 PDF/A 配置文件仍要求使用它。
  • 2.0 新增了一些内容(例如更丰富的关联文件与文件部件结构、通过 AES-256-GCM 扩展提供的更强加密),也移除了一些内容(部分结构标签;收紧的字体嵌入预期;已弃用的 CJK 字符集合)。
  • NextPDF 默认以 2.0 为目标,并能在符合性配置文件有需求时序列化 1.7/1.4 结构。

版本是一项决策,并集中体现在一个地方:序列化策略。

Pdf20StreamStrategysrc/Writer/Pdf20StreamStrategy.php)会写出 %PDF-2.0 文件头、将目录版本报告为 /2.0,并输出压缩的交叉引用。它也直接承载了 2.0 的字体收紧规则。在 2.0 配置文件下,它能对未嵌入的标准 Type 1 字体强制执行规则,而不只是发出警告,因为标准现在预期这些字体要被嵌入。这两个表格策略(Pdf17TableStrategyPdf14TableStrategy)之所以存在,正是因为某些配置文件需要较旧的形式。PDF/A-2/-3 强制使用传统的交叉引用表格,而 PDF/A-1 还额外禁止对象流与交叉引用流。这三种策略都实现同一个 PdfSerializationStrategy 接口,因此接口之上的写入器完全相同。只有 trailer/xref 的形式会改变。

更强的加密也是以同样明确的方式接入的。PdfXrefWritersrc/Writer/PdfXrefWriter.php)会把是否启用 AES-256-GCM(即 2.0 的 ISO/TS 32003 扩展)传递到加密字典中,使输出的处理器版本与密码模式项,和实际生成的字节相符。引擎不会声明一种密码却写出另一种。

整体设计很明确。2.0 是默认值。较旧的结构是刻意可达的,绝不会出于意外。而在 2.0 收紧某项规则之处,NextPDF 能守住收紧后的底线,而不会悄悄放宽它。

  1. Step 1 of 3: ISO 32000-1 PDF 1.7 — the Adobe-authored base, adopted by ISO
  2. Step 2 of 3: ISO 32000-2 PDF 2.0 — ISO-owned consolidation, tightening, and additions
  3. Step 3 of 3: ISO/TS 32003 AES-256-GCM (AESV4) — an encryption extension to PDF 2.0
NextPDF 所推理的 PDF 版本沿革:PDF 1.7 成为 ISO 基础、ISO 32000-2 即 PDF 2.0,而 ISO/TS 32003 以 AES-256-GCM 加密扩充 2.0。

版本声明是规范性要求。 Spec: ISO 32000-2, §7.5.2 规定,写出符合规范文件的处理器标明版本——可以在文件头中,也可以作为目录 /Version 项——并将其标为 2.0,且文件头为 %PDF-1.n%PDF-2.n,后接单个行尾标记。 Spec: ISO 32000-2, §7.7.2 补充说明目录 /Version 会覆盖较早的文件头版本,这正是让增量式版本提升成为可能的原因。 Evidence: Standard-backed

2.0 是整合而非重写,这一点体现在它保留了哪些内容:交叉引用流(/Type /XRef)就是 PDF 1.5 引入、并延续为 2.0 默认选择的同一个机制( Spec: ISO 32000-2, §7.5.8 )。间接对象、trailer 与 startxref 结构,与前一页的说明保持不变。

真正重要的变化是移除与收紧。标准指出,PDF 1.7 标准结构命名空间中存在的六个标准结构元素,并非 PDF 2.0 命名空间的一部分——ArtBlockQuoteTOCReferenceBibEntryCode Spec: ISO 32000-2, Annex L.3 ,命名空间差异由 Spec: ISO 32000-2, §14.8.6 定义)。它也收紧了那十四个标准 Type 1 字体:在 1.0–1.7 中允许这些字体的字典省略度量项,2.0 则不再允许这样做( Spec: ISO 32000-2, §9.6.2.1 )。它还修订了预定义的 CJK 字符集合。例如,Adobe-Korea1 在 2.0 中被弃用,Adobe-KR 则被新增。这些都不会改变现有页面的外观。但它们全都可能改变它是否符合规范

类别范例(2.0 对比 1.7)会改变外观吗?为什么重要
维持不变间接对象、trailer、startxref/%%EOF、xref 流2.0 使用相同的对象模型;大多数工具都能沿用
新增更丰富的关联文件/文件部件结构;AES-256-GCM 加密(ISO/TS 32003)你可选择启用的新能力;较旧的阅读器会安全地忽略它们
收紧预期嵌入 Standard-14 字体;度量不再可省略有效的 1.7 文件可能成为不符合 2.0 规范的文件
移除六个 1.7 命名空间结构元素(ArtBlockQuoteTOCReferenceBibEntryCode);已弃用的 CJK 集合(例如 Adobe-Korea1)无声:没有任何可见迹象提示符合性已丧失

真正重要的 PDF 2.0 变更绝大多数是不可见的:你可选择启用的新增功能,以及在不改变外观的情况下改变符合性的 tightenings/removals ——连一个渲染像素都不会改变。

2.0 文件与 1.7 文件之间唯一可见的差异,往往只有两行——文件头与目录版本——即使其背后的符合性规则可能有很大不同。

%PDF-2.0 % was %PDF-1.7
...
1 0 obj
<< /Type /Catalog /Version /2.0 % catalog states 2.0; overrides header if later
/Pages 2 0 R >>
endobj
...
% Cross-reference STREAM is the 2.0 default (was often a 20-byte table)
99 0 obj
<< /Type /XRef /Size 100 /W [1 2 2] /Filter /FlateDecode /Root 1 0 R >>
stream
<binary xref entries>
endstream
endobj
startxref
12345
%%EOF

阅读器看到 %PDF-2.0 与一个 /Version /2.0。它看不到——但符合性检查器看得到——的是:这份文件现在被预期嵌入其标准字体,且不得使用 2.0 已移除的结构标签。字节层面的差异很少;规则层面的差异却不少。

陷阱在于「我们输出 PDF 2.0,所以我们比以前更符合规范」。写出 %PDF-2.0 是一项声明,而非保证。一份文件可以带着 2.0 文件头,却仍违反 2.0——例如沿用 1.7 下容许的做法:引用未嵌入的标准字体,或使用 2.0 已移除的功能。版本标记提高了用来衡量这份文件的标准。它并不会把文件自动提升到那个标准之上。相反方向的误解,是假设只要改变文件头,1.7 文件就能当作 2.0 运作:通常它会渲染得一模一样,却无法通过符合性检查,因为那些收紧虽然不可见,却是真实存在的。

以 2.0 为基准,意味着 NextPDF 默认采用 2.0 文件结构,并能守住 2.0 收紧后的规则。它并不意味着每一项选用的 2.0 功能都已实现,也不意味着输出 2.0 文件头就能让文件通过 PDF/A、PDF/UA 或任何其他配置文件的认证。那些是叠加在基础规范之上、各自独立且更严格的符合性目标,各有自己的验证方式。

本页是对版本差异的实践导览,而非 ISO 32000-2 相对于 32000-1 的完整变更记录。当某项特定的 2.0 功能或弃用会影响引擎行为时,该行为都锚定于它自身的条款。本页描绘的是整体面貌,而非逐一列举每一项条款层级的差异。

PDF 2.0 与 1.7 阅读器向后兼容吗? 对于未变更的结构,大致兼容。新的 2.0 功能通常经过设计,使较旧的阅读器能忽略其无法理解的部分。但 2.0 专属的功能不会被 1.7 阅读器支持。

文件头与目录 /Version 哪个优先? 当目录 /Version 标示的版本比文件头更新时,它优先。这正是让增量式更新能在不重写文件头的情况下提升文件版本的机制。

为什么 NextPDF 默认使用交叉引用流而非表格? 交叉引用流是顺理成章的 PDF 2.0 机制——更精简,并且能索引压缩对象。当配置文件(特别是某些 PDF/A 等级)要求时,仍会写出 20 字节的表格。

  • PDF 究竟是什么——PDF 2.0 从 1.7 保留下来的对象模型与 xref。
  • 标准的全貌——ISO 32000-2 在 NextPDF 所追踪的众多标准中位于何处,以及一项条款如何落到具体行为。
  • 字体:最难的部分——字体嵌入的收紧是你真正会感受到的 2.0 变更之一。
  • PDF 2.0——标准化为 ISO 32000-2 的 PDF 规范,是第一个归 ISO(而非 Adobe)所有的版本。
  • ISO 32000-1——Adobe PDF 1.7 的 ISO 标准化;PDF 2.0 建立在其上的基础。
  • ISO/TS 32003——以 AES-256-GCM(AESV4)加密扩充 PDF 2.0 的技术规范。
  • 目录 /Version——文件目录中声明 PDF 版本的项;当它标示较新的版本时,会覆盖文件头。
  • 交叉引用流——PDF 1.5+/2.0 的交叉引用机制(/Type /XRef);是 NextPDF 的默认机制,而经典表格仍可供较旧的配置文件使用。
  • 收紧——在 1.7 中属于选用或允许、而在 2.0 中被预期或要求的规则,会在不改变外观的情况下改变符合性。