PDF 檔案結構解析
PDF(Portable Document Format,可攜式文件格式)自 1993 年由 Adobe 推出以來,已經成為全球最通用的文件交換格式。但你有沒有想過,PDF 內部到底長什麼樣?為什麼它能在不同作業系統、不同裝置上呈現完全一致的排版?
PDF 的誕生與演進
PDF 最初由 Adobe 共同創辦人 John Warnock 提出,目標是建立一種「紙上即所見」的數位文件格式。2008 年,PDF 1.7 被 ISO 組織正式採納為國際標準 ISO 32000-1,不再是 Adobe 的專屬格式。2017 年發布的 PDF 2.0(ISO 32000-2)更進一步擴充了功能。
PDF 檔案的四大結構
每個 PDF 檔案都由四個主要部分組成:
1. Header(檔頭)
PDF 檔案的第一行標示了 PDF 版本號,例如 %PDF-1.7。這告訴閱讀器該使用哪個版本的規格來解析這個檔案。
2. Body(主體)
主體包含了文件的所有內容物件,包括文字、圖片、字型、顏色等。每個物件都有一個唯一的識別號碼(Object Number)和版本號(Generation Number)。
3. Cross-Reference Table(交叉參考表)
交叉參考表記錄了每個物件在檔案中的確切位元組位置。這讓 PDF 閱讀器能夠隨機存取任何物件,而不需要從頭讀到尾。這也是 PDF 可以快速跳到第 100 頁的原因。
4. Trailer(檔尾)
檔尾指向交叉參考表的位置,並包含根物件(Catalog)的參考。PDF 閱讀器會從檔案尾端開始讀取,先找到 Trailer,再透過交叉參考表定位所有物件。
重點摘要:PDF 的結構設計讓閱讀器可以從檔案尾端開始解析,透過交叉參考表快速定位任何物件。這就是為什麼 PDF 可以高效地顯示大型文件的任何一頁。
PDF 物件類型
PDF 內部使用 8 種基本物件類型來描述文件內容:
| 物件類型 | 說明 | 範例 |
|---|---|---|
| Boolean | 布林值 | true, false |
| Numeric | 數字(整數或浮點數) | 42, 3.14 |
| String | 文字字串 | (Hello World) |
| Name | 命名符號 | /Type, /Page |
| Array | 有序集合 | [1 2 3] |
| Dictionary | 鍵值對集合 | << /Type /Page >> |
| Stream | 二進位資料流 | 用於圖片、字型等大型資料 |
| Null | 空值 | null |
頁面樹(Page Tree)
PDF 使用樹狀結構來組織頁面。根節點是 Catalog 物件,它指向 Pages 物件(頁面樹的根),Pages 再指向各個 Page 物件。這種結構讓 PDF 閱讀器能高效地管理數千頁的文件。
每個 Page 物件包含:
- MediaBox — 頁面的實體大小(例如 A4: 595 x 842 點)
- Contents — 指向描述頁面內容的 Stream 物件
- Resources — 該頁面使用的資源(字型、圖片等)
Content Stream(內容流)
頁面的實際內容(文字、圖形、圖片)透過「內容流」來描述。內容流使用一套專門的 PDF 運算子,類似於 PostScript 語言。例如:
- BT / ET — 開始/結束文字區塊
- Tf — 設定字型和大小
- Td — 移動文字位置
- Tj — 顯示文字
- re / f — 繪製矩形 / 填色
為什麼理解 PDF 結構很重要?
了解 PDF 的內部結構有助於:
- 理解為什麼 PDF 轉圖片時需要「渲染」而非單純「截取」
- 明白 DPI 設定如何影響轉換後的圖片品質
- 知道為什麼有些 PDF 轉換很快,有些很慢(取決於內容複雜度)
- 理解加密 PDF 為何無法直接轉換
結語
PDF 看似簡單的一個檔案格式,內部其實蘊含了精巧的結構設計。從物件系統到交叉參考表,從頁面樹到內容流,每個部分都為了實現「跨平台一致呈現」這個核心目標而設計。下次當你使用 PDF 時,不妨多想想這些背後的技術。
參考文獻
- Adobe Systems Incorporated. "PDF Reference, Sixth Edition: Adobe Portable Document Format Version 1.7." Adobe, 2006. https://opensource.adobe.com/dc-acrobat-sdk-docs/pdfstandards/PDF32000_2008.pdf
- ISO. "ISO 32000-1:2008 — Document management — Portable document format — Part 1: PDF 1.7." International Organization for Standardization, 2008. https://www.iso.org/standard/51502.html
- PDF Association. "PDF Specification Index." PDF Association, 2024. https://www.pdfa.org/resource/pdf-specification-index/
- ISO. "ISO 32000-2:2020 — Document management — Portable document format — Part 2: PDF 2.0." International Organization for Standardization, 2020. https://www.iso.org/standard/75839.html