引言
在“PDF学习二 PDF物理结构”的说明里用了较大的篇幅说明了交叉引用表,但是有人表示说,用记事本打开一个PDF文件,并没有看到所谓的交叉引用表。
精华提炼出来的文档的描述有错误么?非也,只是交叉引用表现在使用的比较少了,大部分的pdf文件都在使用交叉引用流
无奈只能开了一个杂谈说明下PDF对象流,对PDF物理结构的一个补充。
正文
先来了解下什么是对象流 Object Streams
来个定义: 从PDF1.5开始新增object stream,包含一系列的PDF对象,类似文件体。
优点:
- 压缩PDF对象
- 减小PDF文件大小
大部分对象都可出现在对象流中,除了以下情况:
- 流对象 Stream Objects。
- 对象的产生号不是0。
- 文档的加密字典。
- 一个对象的Length条目出现在对象流字典中。
以下是解码后的Object Stream例子:
15 0 obj % 对象流 object stream
<< /Type /ObjStm % 类型必需是ObjStm
/Length 1856
/N 3 % 对象流中对象数
/First 24 % 第一个对象的偏移值
>>
stream
% 对象号和相对于第一个对象的偏移值
11 0 12 547 13 665 % 11、12和13是对象号,0、547和665是偏移值
<< /Type /Font % 略去obj和endobj,以<<与>>分隔。
/Subtype /TrueType
...other keys...
/FontDescriptor 12 0 R
>>
接着重点,什么是交叉引用流 Cross-Reference Streams
再来个定义: 从PDF1.5开始新增Cross-Reference Streams,包含一个字典类似物理结构中trailer字典和一个数据流存储交叉引用表的数据。
优点:
- 交叉引用信息更紧凑。
- 能够访问存储在Object Stream中的被压缩的对象,方便增加新的交叉引用信息。
12 0 obj % Cross-reference stream
<< /Type /XRef % 交叉引用流字典替代trailer字典
/Size ... % 类似trailer中的Size有多少对象
/Root ...
/W [1 2 1] % 交叉引用流中数据分布由1字节、2字节、1字节表示
>>
stream
... % 流数据包含交叉引用信息
endstream
endobj
... more objects ...
startxref % startxref 替代xref
byte_offset_of_cross-reference_stream % Points to object 12
%%EOF
交叉引用流中数据含义:
例子:
对象与交叉引用表
|
对象流
|
交叉应用流
|
---|---|---|
1 0 obj % The document root, at offset 23. |
2 0 obj % The object stream, at offset 3722 |
11 0 obj % The cross-reference stream, at offset 4899 02 0002 00 % Entry for object 3 (in object stream 2, index 0) |
尾声
恶补了下PDF Reference,找到以上说明,不足之处请指出。
微信公众号