PDF 2.0:有哪些變更
ISO 32000-2 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 結構。
NextPDF 的處理方式
標題為「NextPDF 的處理方式」的區段版本是一個決策,集中體現在一個地方:序列化策略。
Pdf20StreamStrategy(src/Writer/Pdf20StreamStrategy.php)會寫出 %PDF-2.0 檔頭、將目錄版本回報為 /2.0,並輸出壓縮的交叉參照串流。它也直接落實 2.0 的字型收緊規則。在 2.0 設定檔下,它能強制執行未嵌入的標準 Type 1 字型規則,而不只是發出警告,因為標準現在預期這些字型要被嵌入。這兩個表格策略(Pdf17TableStrategy、Pdf14TableStrategy)之所以存在,正是因為某些設定檔需要較舊的形式。PDF/A-2/-3 強制使用傳統的交叉參照表格,而 PDF/A-1 還額外禁止物件串流與交叉參照串流。這三種策略都實作同一個 PdfSerializationStrategy 介面,因此介面之上的寫入器完全相同。只有 trailer/xref 的形式會改變。
更強的加密也以同樣刻意的方式串接。PdfXrefWriter(src/Writer/PdfXrefWriter.php)會將 AES-256-GCM 的啟用狀態(即 2.0 的 ISO/TS 32003 擴充)傳播到加密字典中,使輸出的處理器版本與密碼模式項目,和實際產生的位元組相符。引擎不會宣告一種密碼,卻寫出另一種。
整體設計是這樣的:2.0 是預設。較舊的結構必須刻意選擇才會使用,絕不會意外產生。而在 2.0 收緊某項規則之處,NextPDF 能守住收緊後的底線,不會悄悄放寬它。
- Step 1 of 3: ISO 32000-1 PDF 1.7 — the Adobe-authored base, adopted by ISO
- Step 2 of 3: ISO 32000-2 PDF 2.0 — ISO-owned consolidation, tightening, and additions
- Step 3 of 3: ISO/TS 32003 AES-256-GCM (AESV4) — an encryption extension to PDF 2.0
證據怎麼說
標題為「證據怎麼說」的區段版本宣告是規範性的。 Spec: ISO 32000-2, §7.5.2 ISO 32000-2 §7.5.2 規定,處理器在寫出符合規範的檔案時應標明版本——可在檔頭中,也可作為目錄 /Version 項目——並標示為 2.0,且檔頭為 %PDF-1.n 或 %PDF-2.n,後接單一行尾標記。
Spec: ISO 32000-2, §7.7.2 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 ISO 32000-2 §7.5.8 )。間接物件、trailer 與 startxref 結構,與前一頁的說明維持不變。
真正重要的變更是移除與收緊。標準記載,存在於 PDF 1.7 標準結構命名空間中的六個標準結構元素,並非 PDF 2.0 命名空間的一部分——Art、BlockQuote、TOC、Reference、BibEntry 與 Code( Spec: ISO 32000-2, Annex L.3 ISO 32000-2 Annex L.3 ,命名空間差異依 Spec: ISO 32000-2, §14.8.6 ISO 32000-2 §14.8.6 定義)。它也收緊了十四個標準 Type 1 字型的規則:在 1.0–1.7 中,允許這些字型的字典省略度量項目,2.0 則不再允許( Spec: ISO 32000-2, §9.6.2.1 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 命名空間結構元素(Art、BlockQuote、TOC、Reference、BibEntry、Code);已棄用的 CJK 集合(例如 Adobe-Korea1) | 否 | 無聲發生:外觀不會提示符合性已經喪失 |
真正重要的 PDF 2.0 變更絕大多數是不可見的:你可選擇啟用的新增功能,以及在不改變外觀的情況下改變符合性的收緊與移除 ——連一個算繪後的像素都不會改變。
實務範例
標題為「實務範例」的區段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>endstreamendobjstartxref12345%%EOF閱讀器看到 %PDF-2.0 與一個 /Version /2.0。它看不到——而符合性檢查器看得到——的是:這份檔案現在被預期要嵌入其標準字型,且不得使用 2.0 已移除的結構標籤。差異的位元組很少。差異的規則卻不少。
常見誤解
標題為「常見誤解」的區段陷阱在於「我們輸出 PDF 2.0,所以我們比以前更符合規範」。寫出 %PDF-2.0 是一項宣稱,而非保證。一份檔案可以帶著 2.0 檔頭,卻仍違反 2.0——例如參照未嵌入的標準字型,或使用 2.0 已移除的功能——而這些做法在 1.7 下可能原本被允許。版本標記提高了衡量這份檔案所依據的標準,卻不會把檔案抬升到那個標準之上。相反方向的錯誤,是假設只要改變檔頭,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 中被預期或要求的規則,會在不改變外觀的情況下改變符合性。