PDF 檔案格式詳解:結構、圖層與標準
PDF 檔案內部究竟包含什麼?透過標示圖解與術語解析,涵蓋四個實體區段(標頭、主體、交叉參考表、尾部)、六個內容圖層(文字、影像、字型、註解、向量圖、簽章)、中繼資料,以及建構於其上的 ISO 標準(PDF/A、PDF/X、PDF/UA、PDF/E、PDF/VT)。
PDF 並非單一實體。它是一個二進位容器,在磁碟上具有特定的結構,內部堆疊了一組內容圖層,並在其頂部建構了一系列 ISO 標準。使用十六進位編輯器開啟,結構會顯示在最前面的幾行純文字中。在檢視器中開啟,則各圖層會合併呈現為單一頁面。
本指南為標示式參考:包含實體檔案結構、主體所含的內容圖層、環繞一切的中繼資料,以及為特定使用案例而限制其格式的標準(PDF/A、PDF/X、PDF/UA、PDF/E、PDF/VT)。

想在您的部落格上使用此圖表嗎? 複製此嵌入程式碼:
四個實體區段
磁碟上的每個 PDF 檔案都具有相同的四部分結構,順序如下:
1. 標頭 (Header)
檔案的第一行。永遠以 %PDF- 開頭,後接版本號碼:
%PDF-1.7版本範圍從 1.0(1993 年發佈)到 2.0(2017 年發佈,目前最新)。標頭後面會有一行註解,包含二進位位元組,用以告知 FTP 等傳輸工具這是一個二進位檔案。
2. 主體 - 間接物件 (Body - Indirect Objects)
檔案的主體部分。每個頁面、字型、影像、註解和表單欄位都是一個編號的間接物件:
1 0 obj
<< /Type /Catalog /Pages 2 0 R >>
endobj
2 0 obj
<< /Type /Pages /Kids [3 0 R] /Count 1 >>
endobj
3 0 obj
<< /Type /Page /Parent 2 0 R /Contents 4 0 R /Resources << ... >> >>
endobj每個物件都有一個 ID(0 obj 前的數字)、一個產生編號(0,用於增量更新),以及介於 << 和 >> 之間的負載(用於字典)或 stream 和 endstream(用於二進位串流,如影像資料、字型資料、壓縮內容)。
物件之間使用 <id> <gen> R 語法互相參照(例如,3 0 R 表示「物件 3,產生 0」)。這就是頁面如何參照其使用的字型,或目錄如何參照頁面樹的根節點。
3. 交叉參考表 (Cross-Reference Table - xref)
一個位元組偏移查找表。對於主體中的每個物件,xref 會記錄其在檔案中的絕對位元組位置:
xref
0 6
0000000000 65535 f
0000000017 00000 n
0000000089 00000 n
0000000172 00000 n
0000000299 00000 n
0000000453 00000 n這使得 PDF 檔案可以進行隨機存取。檢視器可以讀取 xref,直接跳到物件 3 的位元組偏移量,而無需解析檔案的其餘部分即可渲染該頁面。這也是為何單一章節的 PDF 檔案即使來源檔案有 500 頁也能立即開啟的原因。
4. 尾部 (Trailer)
最後一個區段。告知解析器從何處尋找 xref 以及哪個物件是根物件:
trailer
<< /Size 6 /Root 1 0 R /Info 7 0 R >>
startxref
1893
%%EOFstartxref 值是 xref 表的位元組偏移量。%%EOF 標記是檔案的實際結束。尾部使得增量更新成為可能:在檔案末尾附加一個新的 xref + 尾部,即可在不重寫整個檔案的情況下添加物件。
六個內容圖層
在主體內部,內容儲存在六種圖層類型中。每個渲染的 PDF 頁面都是這些圖層的複合體:
1. 文字 (Text)
字形位置指令和字型參照,而非文字字串。PDF 儲存的指令是「在位置 (120, 540) 繪製字型 F3 的字形 42」,而不是「在此處繪製字母 A」。這就是為何文字可選取且可搜尋的原因:檢視器透過 ToUnicode 映射(或 CJK 字型的 CMap)將字形 ID 反向映射到 Unicode 編碼點。
當文字缺少 ToUnicode 映射時,就會出現經典的「可選取文字卻複製出亂碼的 PDF」問題。文字是可見的,但字形到 Unicode 的映射已損壞或缺失。
2. 影像 (Images)
儲存為嵌入式串流,格式有多種:
- JPEG (DCTDecode 過濾器):相片,最常見
- JPEG2000 (JPXDecode):壓縮率更高,較不常見
- 類似 PNG (FlateDecode + Predictor):螢幕截圖、線條圖
- CCITT Group 4 (CCITTFaxDecode):黑白掃描文字,用於封存掃描
- JBIG2 (JBIG2Decode):二值影像,OCR 文件中常見
影像可以被降取樣、重新壓縮或替換,而不會影響其他內容。
3. 字型 (Fonts)
嵌入為完整的字型程式、子集(僅包含使用的字形)或按名稱參照(必須安裝在檢視器系統上)。子集是預設選項,可大幅縮減檔案大小。支援的字型格式:Type1、TrueType、OpenType 和 CIDFont(用於 CJK)。
當字型被參照但未嵌入且未安裝在檢視器系統上時,檢視器會替換為類似的字型,這通常看起來不正確。PDF/A 要求嵌入所有字型以避免此問題。
4. 註解 (Annotations)
高亮、註解、連結、圖章、浮水印和表單欄位都屬於註解。它們疊加在頁面內容之上,可以添加、編輯或移除,而不會更改底層頁面。
表單欄位是特殊情況:一個互動式小工具註解(可見部分)加上一個欄位字典(資料部分)。當您填寫表單並儲存時,只有欄位字典會變更,頁面本身不受影響。
5. 向量圖形 (Vector Graphics)
使用類似 PostScript 的運算子(moveto、lineto、curveto)繪製的線條、形狀、曲線和路徑。可無限縮放而不損失品質。PDF 中的大多數 CAD 匯出、圖表和示意圖都是向量圖形。
6. 數位簽章 (Digital Signatures)
基於 PKI 的簽章,綁定到檔案的位元組範圍。簽章字典指定「位元組 0 到 12,547 以及 14,200 到檔案結尾是簽署的」——中間一小段範圍保留給簽章值本身。對簽署位元組範圍的任何變更都會使簽章無效,這就是 PDF 如何偵測簽署後的竄改。
有些 PDF 具有多個簽章,以增量更新的形式疊加——每個簽署者都會簽署他們收到時的檔案,從而保留了鏈條。
中繼資料:兩個並行的系統
PDF 有兩個經常意見不合的中繼資料系統:
標準 /Info 字典
儲存在尾部。欄位:Title、Author、Subject、Keywords、Creator(使用者建立文件的應用程式)、Producer(產生 PDF 的應用程式)、CreationDate、ModDate。純文字字串,任何 PDF 工具都易於讀取。
XMP 中繼資料串流
一個獨立的 XML 串流(Adobe XMP,基於 RDF/XML),支援更豐富的結構描述:Dublin Core、IPTC、自訂領域特定結構描述(色彩設定檔、版權註冊、手稿版本控制)。
現代 PDF 產生器會同時寫入兩者。舊的 PDF 僅有 /Info。有些 PDF 具有來自先前版本的過時 /Info 和來自近期編輯的準確 XMP,反之亦然。稽核 PDF 的合規性或鑑識時,請同時檢查兩者。
基於 PDF 建構的 ISO 標準
基礎 PDF 規格是 ISO 32000。數個衍生標準為特定使用案例限制了 PDF 的格式:
| 標準 | 用途 | 限制 |
|---|---|---|
| PDF/A | 長期封存 | 所有字型皆嵌入,無 JavaScript,無音訊/視訊,色彩空間獨立於裝置。合規等級:PDF/A-1、A-2、A-3(允許檔案附件) |
| PDF/X | 印刷生產 | CMYK 色彩,嵌入字型和色彩設定檔,無透明度(PDF/X-1a)或受控透明度(PDF/X-4) |
| PDF/UA | 無障礙 | 標記結構樹,語言中繼資料,影像的替代文字,邏輯閱讀順序 |
| PDF/E | 工程 | 3D 模型(U3D、PRC 格式),CAD 特定中繼資料 |
| PDF/VT | 可變交易印刷 | 針對大量個人化郵件進行優化 |
一個 PDF 可以同時符合多個標準——PDF/A-2u(支援 Unicode 映射的封存)加上 PDF/UA(無障礙)對於政府和法律檔案庫來說很常見。
線性化 PDF(網路最佳化)
「線性化」或「網路最佳化」的 PDF 會重新排序主體,使第一頁的物件在檔案中較早出現。網路檢視器只需下載約 50 KB 的資料即可渲染第一頁,而無需等待整個檔案下載完畢。尾部會複製到檔案開頭,並加上一個提示表,告知檢視器每個頁面的起始位置。
大多數現代 PDF 產生器都支援線性化作為「儲存為網頁」選項。該格式會增加 2-5% 的檔案大小,以換取在慢速連線上的快速第一頁渲染。
加密與權限
PDF 可以透過密碼(或憑證)進行加密,並授予細粒度的權限:列印、複製文字、修改、填寫表單、提取以供無障礙使用。加密儲存在尾部的 /Encrypt 字典中。
加密強度已演進:RC4 40 位元(早期 PDF,現已極易破解)、RC4 128 位元(仍然較弱)、AES-128、AES-256。最初的 Acrobat 5 RC4 實作於 2001 年公開被破解;現代 PDF 加密(AES-256、PDF 2.0)在搭配強密碼使用時是穩固的。
注意:「權限」是建議性質的。尊重這些權限的檢視器會強制執行。忽略這些權限的檢視器(或移除加密的工具)則不會。
PDFSub 如何讀取 PDF
PDFSub 使用 Rust 的 PDFium 綁定(與 Chromium 的 PDF 檢視器相同的引擎)以及 PaddleOCR 處理掃描文件。有關完整架構細節以及與雲端工具的比較,請參閱 瀏覽器 vs 雲端 PDF 安全性。
若要將 PDF 轉換為其他格式並保留上述結構:
- PDF 轉 Excel - 提取文字+表格,保留座標
- OCR PDF - 為掃描的 PDF 添加可搜尋的文字圖層
- PDF 轉 Word - 將文字重排成可編輯段落
- 壓縮 PDF - 降取樣影像,子集化字型
對於封存工作流程,請參閱 如何將 PDF 轉換為 PDF/A。
進一步閱讀
- ISO 32000-2 (PDF 2.0 規格) - 權威參考,需付費
- Adobe PDF 參考檔案庫 - PDF 1.7 的免費參考資料
- PDF Association - 行業工作組,提供免費文章和合規測試檔案
關於 PDF 特定主題:律師的 PDF 合規性指南、PDF/A 轉換指南。