← 返回首页

PDF 文件实例分析

通过分析一个最小 PDF 文件,深入理解 PDF 格式的工作原理

最小 PDF 文件结构

graph LR Root((PDF)) Root --> H[文件头
%PDF-1.4] Root --> O1[对象 1
Catalog] Root --> O2[对象 2
Pages] Root --> O3[对象 3
Page] Root --> O4[对象 4
Contents] Root --> O5[对象 5
Font] Root --> X[XRef
索引表] Root --> T[Trailer
+ EOF]

完整的 PDF 文件示例

以下是一个可正常打开的 1 页 PDF 文件,包含"Hello, World!"文本:

PDF 文件完整代码

%PDF-1.4
%âãÏÓ

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/MediaBox[0 0 612 792]/Contents 4 0 R/Resources<</Font<</F1 5 0 R>>>>>
endobj

4 0 obj
<</Length 44>>
stream
BT/F1 12 Tf 100 700 Td(Hello, World!)Tj ET
endstream
endobj

5 0 obj
<</Type/Font/Subtype/Type1/BaseFont/Helvetica>>
endobj

xref
0 6
0000000000 65535 f 
0000000009 00000 n 
0000000052 00000 n 
0000000101 00000 n 
0000000198 00000 n 
0000000293 00000 n 
trailer
<</Size 6/Root 1 0 R>>
startxref
370
%%EOF

1️⃣ 文件头(第 1-2 行)

代码

%PDF-1.4
%âãÏÓ
  • %PDF-1.4 - PDF 版本声明,表示这是 PDF 1.4 格式
  • %âãÏÓ - 二进制注释(字节 0xE2 0xE3 0xCF 0xD3),确保文件以二进制模式处理

2️⃣ 对象 1:Catalog 根对象(第 4-6 行)

代码

1 0 obj
<</Type/Catalog/Pages 2 0 R>>
endobj
  • 1 0 obj - 对象号 1,生成号 0
  • /Type /Catalog - 指定为文档目录对象
  • /Pages 2 0 R - 引用对象 2(Pages 树)

3️⃣ 对象 2:Pages 页面树(第 8-10 行)

代码

2 0 obj
<</Type/Pages/Kids[3 0 R]/Count 1>>
endobj
  • /Kids [3 0 R] - 子页面数组,包含对象 3
  • /Count 1 - 总页数为 1

4️⃣ 对象 3:Page 页面对象(第 12-14 行)

代码

3 0 obj
<</Type/Page/Parent 2 0 R/MediaBox[0 0 612 792]/Contents 4 0 R/Resources<</Font<</F1 5 0 R>>>>>
endobj
  • /MediaBox [0 0 612 792] - 页面尺寸(8.5×11 英寸)
  • /Contents 4 0 R - 内容流引用对象 4
  • /Resources - 资源字典,包含字体 F1(对象 5)

5️⃣ 对象 4:内容流(第 16-21 行)

代码

4 0 obj
<</Length 44>>
stream
BT/F1 12 Tf 100 700 Td(Hello, World!)Tj ET
endstream
endobj
  • BT/ET - Begin Text/End Text 文本块标记
  • /F1 12 Tf - 使用 F1 字体,12 点大小
  • 100 700 Td - 移动到坐标 (100, 700)
  • (Hello, World!) Tj - 显示文本

6️⃣ 对象 5:字体定义(第 23-25 行)

代码

5 0 obj
<</Type/Font/Subtype/Type1/BaseFont/Helvetica>>
endobj
  • /Subtype /Type1 - Type1 字体(标准 14 字体之一)
  • /BaseFont /Helvetica - Helvetica 字体,无需嵌入

7️⃣ 交叉引用表和文件尾(第 27-38 行)

代码

xref
0 6
0000000000 65535 f 
0000000009 00000 n 
...
trailer
<</Size 6/Root 1 0 R>>
startxref
370
%%EOF
  • xref - 交叉引用表,记录对象偏移量
  • startxref 370 - XRef 表起始位置(370 字节处)
  • %%EOF - 文件结束标记