PDF文件体详解
文件体是PDF文档的核心内容区域,包含了构成文档视觉和结构的所有数据。它由一系列PDF对象组成,这些对象通过对象编号和生成号进行唯一标识。
PDF文件体 基本对象类型 核心功能对象 组织结构 布尔对象 数值对象 字符串对象 名称对象 数组对象 字典对象 流对象 空对象 页面对象 内容流对象 字体对象 资源字典 图像对象 文档目录 页面树 资源管理 内容流 定义页面属性 绘制指令 字体信息 资源集合 Catalog对象 Pages对象 Font/XObject Stream数据
文件体的基本结构
对象定义语法
pdf
对象号 生成号 obj
<<
对象内容
>>
endobj
示例:
pdf
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)
表示真或假的值
pdf
true
false
2. 数值对象 (Numeric)
包括整数和实数
pdf
42 % 整数
-100 % 负整数
3.14 % 实数
123.456 % 实数
3. 字符串对象 (String)
分为文字字符串和十六进制字符串
文字字符串:
pdf
(Hello World) % 简单字符串
(Embedded (nested)) % 嵌套括号
(Special\() % 转义字符:\(
(Line1\nLine2) % 换行符
十六进制字符串:
pdf
<48656C6C6F> % "Hello"的十六进制表示
<FFFE0041> % 带BOM的Unicode字符
4. 名称对象 (Name)
以斜杠开头,用于标识字典中的键和特殊值
pdf
/Type
/Page
/F1
/Length
/ASCII85Decode
5. 数组对象 (Array)
有序的对象集合
pdf
[0 0 612 792] % 页面尺寸数组
[(Hello) (World)] % 字符串数组
[1 0 R 2 0 R 3 0 R] % 引用对象数组
[/Title /Author /Subject] % 名称数组
6. 字典对象 (Dictionary)
键值对集合,用双尖括号包裹
pdf
<<
/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)
包含大量二进制数据,通常用于页面内容和图像
pdf
7 0 obj
<<
/Length 85
/Filter /ASCII85Decode
>>
stream
6YV%f8kLZEQ8dEV5uX8dEV8dLh>5uX8dEV8dLh>5uX8dEV8dLh>5uX8dEV8dLh>5uX
endstream
endobj
8. 空对象 (Null)
表示空值
pdf
null
核心对象类型详解
页面对象 (Page Object)
定义页面的基本属性
pdf
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)
包含绘制页面的操作指令
pdf
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)
定义文档中使用的字体
pdf
4 0 obj
<<
/Type /Font
/Subtype /Type1
/BaseFont /Helvetica
/Encoding /WinAnsiEncoding
>>
endobj
资源字典 (Resource Dictionary)
集中管理页面资源
pdf
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
对象引用机制
直接引用
pdf
4 0 R % 引用对象4,生成号0
间接对象定义
pdf
1 0 obj % 定义对象1
(Indirect String)
endobj
引用使用
pdf
2 0 obj
<<
/Title 1 0 R % 引用对象1的内容
>>
endobj
文件体的组织结构
典型对象层次结构
pdf
% 文档目录
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. 内容分层
- 图形状态栈管理
- 透明度支持
- 图层组合操作
实际应用示例
创建简单页面
pdf
% 页面内容流
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格式能够处理复杂文档内容的技术基础。