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.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 - 文件结束标记