PDF 内部结构
PDF 文件解析序列图
sequenceDiagram
autonumber
participant Reader as PDF 阅读器
participant Header as 文件头
participant Body as 文档主体
participant XRef as 交叉引用表
participant Trailer as 文件尾
Reader->>Header: 读取版本标识
Note over Reader,Header: 确认 PDF 版本 (如%PDF-2.0)
Reader->>Trailer: 定位文件尾
Note over Reader,Trailer: 回溯查找 startxref
Reader->>XRef: 解析交叉引用表
Note over Reader,XRef: 获取所有对象偏移量
Reader->>Body: 读取 Catalog 对象
Note over Reader,Body: 文档根对象
Reader->>Body: 遍历 Pages 树
Note over Reader,Body: 加载所有页面
Reader->>Body: 解析内容流
Note over Reader,Body: 渲染文本和图像
Reader->>Reader: 完成文档显示
文件头
%PDF-2.0
↓
文档主体
间接对象集合
↓
交叉引用表
XRef 流/表
↓
文件尾
startxref + %%EOF
PDF 对象层次结构
graph TD
Catalog[Catalog
文档根对象] --> Pages[Pages
页面树节点] Pages --> Page1[Page
第 1 页] Pages --> Page2[Page
第 2 页] Page1 --> Content1[Contents
内容流] Page1 --> Resources1[Resources
资源字典] Resources1 --> Font1[Font
字体] Resources1 --> Image1[XObject
图像] Resources1 --> ColorSpace[ColorSpace
色彩空间]
文档根对象] --> Pages[Pages
页面树节点] Pages --> Page1[Page
第 1 页] Pages --> Page2[Page
第 2 页] Page1 --> Content1[Contents
内容流] Page1 --> Resources1[Resources
资源字典] Resources1 --> Font1[Font
字体] Resources1 --> Image1[XObject
图像] Resources1 --> ColorSpace[ColorSpace
色彩空间]
8 种基本对象类型
- Boolean - true 或 false
- Integer - 有符号整数(如 42、-17)
- Real - 浮点数(如 3.14、-0.001)
- String - 文本字符串(如 (Hello) 或 <48656C6C6F>)
- Name - 名称对象(如 /Type、/Length)
- Array - 有序集合(如 [1 2 3])
- Dictionary - 键值对集合(如 <</Key value>>)
- Stream - 二进制数据流(带长度和过滤器)
文档结构对象
- Catalog - 文档根对象,包含/Pages 引用
- Pages - 页面树节点,包含/Kids 数组
- Page - 单页对象,包含/MediaBox 和/Contents
- Contents - 内容流,包含页面绘制指令
- Resources - 资源字典,包含字体、图像等
- Annotations - 注释数组,包含链接、批注等
- Outlines - 书签/大纲树结构
PDF 对象语法示例
% 间接对象定义
10 0 obj
<<
/Type /Catalog
/Pages 20 0 R
/ViewerPreferences <<
/DisplayDocTitle true
>>
/OpenAction [30 0 R /Fit]
>>
endobj
% 流对象(带压缩)
5 0 obj
<<
/Length 1234
/Filter /FlateDecode
>>
stream
xúePMK...
endstream
endobj
| 组成部分 | 说明 | 格式示例 | 作用 |
|---|---|---|---|
| 文件头 | 标识 PDF 版本,必须是文件的第一行 | %PDF-2.0 |
版本声明,第二行是二进制标记 |
| 间接对象 | PDF 的基本构建单元,有唯一对象号 | 1 0 obj |
存储所有 PDF 数据 |
| 流对象 | 包含二进制数据的对象,可压缩 | stream |
存储内容流、图像等 |
| XRef 表 | 记录所有对象的字节偏移量 | xref |
实现快速随机访问 |
| Trailer | 包含文档根对象引用 | trailer |
解析入口点 |