【PDF】PDF文件体详解
PDF文件体详解
文件体是PDF文档的核心内容区域,包含了构成文档视觉和结构的所有数据。它由一系列PDF对象组成,这些对象通过对象编号和生成号进行唯一标识。
文件体的基本结构
对象定义语法
对象号 生成号 obj
<<对象内容
>>
endobj
示例:
4 0 obj
<</Type /Page/Parent 3 0 R/Resources 5 0 R/Contents 6 0 R/MediaBox [0 0 612 792]
>>
endobj
PDF对象的八大类型
1. 布尔对象 (Boolean)
表示真或假的值
true
false
2. 数值对象 (Numeric)
包括整数和实数
42          % 整数
-100        % 负整数
3.14        % 实数
123.456     % 实数
3. 字符串对象 (String)
分为文字字符串和十六进制字符串
文字字符串:
(Hello World)           % 简单字符串
(Embedded (nested))     % 嵌套括号
(Special\()             % 转义字符:\(
(Line1\nLine2)          % 换行符
十六进制字符串:
<48656C6C6F>            % "Hello"的十六进制表示
<FFFE0041>              % 带BOM的Unicode字符
4. 名称对象 (Name)
以斜杠开头,用于标识字典中的键和特殊值
/Type
/Page
/F1
/Length
/ASCII85Decode
5. 数组对象 (Array)
有序的对象集合
[0 0 612 792]                           % 页面尺寸数组
[(Hello) (World)]                       % 字符串数组
[1 0 R 2 0 R 3 0 R]                     % 引用对象数组
[/Title /Author /Subject]               % 名称数组
6. 字典对象 (Dictionary)
键值对集合,用双尖括号包裹
<</Type /Page/Parent 2 0 R/Resources <</Font <</F1 4 0 R>>/ProcSet [/PDF /Text]>>/MediaBox [0 0 612 792]/Contents 5 0 R
>>
7. 流对象 (Stream)
包含大量二进制数据,通常用于页面内容和图像
7 0 obj
<</Length 85/Filter /ASCII85Decode
>>
stream
6YV%f8kLZEQ8dEV5uX8dEV8dLh>5uX8dEV8dLh>5uX8dEV8dLh>5uX8dEV8dLh>5uX
endstream
endobj
8. 空对象 (Null)
表示空值
null
核心对象类型详解
页面对象 (Page Object)
定义页面的基本属性
3 0 obj
<</Type /Page/Parent 2 0 R/Resources <</Font <</F1 4 0 R/F2 5 0 R>>/XObject <</Im1 6 0 R>>/ProcSet [/PDF /Text /ImageB]>>/MediaBox [0 0 612 792]/CropBox [36 36 576 756]/Contents 7 0 R/Rotate 0
>>
endobj
内容流对象 (Content Stream)
包含绘制页面的操作指令
7 0 obj
<</Length 156
>>
stream
q
0.1 0.1 0.1 rg
BT
/F1 24 Tf
72 720 Td
(Hello PDF World) Tj
ET
Q
endstream
endobj
内容流操作符说明:
- q/- Q:保存/恢复图形状态
- BT/- ET:开始/结束文本对象
- Tf:设置字体和大小
- Td:移动文本位置
- Tj:显示文本
- rg:设置填充颜色
字体对象 (Font Object)
定义文档中使用的字体
4 0 obj
<</Type /Font/Subtype /Type1/BaseFont /Helvetica/Encoding /WinAnsiEncoding
>>
endobj
资源字典 (Resource Dictionary)
集中管理页面资源
8 0 obj
<</Font <</F1 9 0 R/F2 10 0 R>>/XObject <</Image1 11 0 R/Form1 12 0 R>>/ExtGState <</GS1 13 0 R>>/ProcSet [/PDF /Text /ImageB /ImageC]
>>
endobj
对象引用机制
直接引用
4 0 R        % 引用对象4,生成号0
间接对象定义
1 0 obj      % 定义对象1
(Indirect String)
endobj
引用使用
2 0 obj
<</Title 1 0 R    % 引用对象1的内容
>>
endobj
文件体的组织结构
典型对象层次结构
% 文档目录
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 /Resources 4 0 R /Contents 5 0 R >> endobj% 资源字典
4 0 obj << /Font << /F1 6 0 R >> >> endobj% 内容流
5 0 obj << /Length 44 >> stream ... endstream endobj% 字体对象
6 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Helvetica >> endobj
文件体的关键特性
1. 对象独立性
- 每个对象可以独立解析
- 对象之间通过引用建立关系
- 支持增量更新
2. 数据压缩
- 流对象支持多种过滤器
- 可选的压缩算法:
- /FlateDecode(zlib压缩)
- /ASCII85Decode(ASCII编码)
- /LZWDecode(LZW压缩)
 
3. 资源管理
- 字体、图像等资源可共享
- 通过资源字典统一管理
- 支持外部资源引用
4. 内容分层
- 图形状态栈管理
- 透明度支持
- 图层组合操作
实际应用示例
创建简单页面
% 页面内容流
10 0 obj
<</Length 200
>>
stream
1.0 0.0 0.0 RG           % 设置红色描边
2 w                      % 设置线宽
100 100 m                % 移动到起点
200 200 l                % 画线到终点
S                         % 描边路径
0.0 0.0 1.0 rg           % 设置蓝色填充
100 500 100 50 re        % 绘制矩形
f                         % 填充路径
BT
/F1 12 Tf
100 400 Td
(Hello PDF!) Tj
ET
endstream
endobj
文件体通过这种结构化的对象组织方式,实现了文档内容的模块化管理和高效渲染,是PDF格式能够处理复杂文档内容的技术基础。
