这几天,一直看PDF的文档格式的资料,有点搞不懂交叉表里的对象号(object number)和生成号(generation number)有什么区别和联系。

 
据PDF交叉参考表的定义:
 
<cross-reference section> ::=
                                            xref
                                           <cross-reference subsection>+
 
<cross-reference subsection>::=
                                           <object number of first enctry in subsection>
                                           <number of entries in subsection>
                                           <cross-reference entry>+
<cross-reference entry>::=<in-use entry>|<free entry>
<in-use entry> ::= <offset> <generation number> n <end-of-line>
<free entry> ::= <offset> <generation number> f <end-of-line>
<end-of-line> ::<space> <carriage return> | <space> <linefeed>|<carriage return> <linefeed>
 
举个例子:
xref
0 6
00000003 65536 f
00000017 00000 n
00000081 00000 n
00000000 00007 f
00000331 00000 n
00000400 00000 n
 
其中,
第一行:xref表示这是个交叉参考表。
第二行:0 6。应该对应<cross-reference subsection>结构的 "<object number of first enctry in subsection>  <number of entries in subsection>"。0是交叉参考子表的第一个入口的对象号,这个有些不太懂。6代表入口数,也就是记录条数。
第三行到到最后一行,每行对应的结构是<cross-reference entry>。有两类,一类是,在用的对象入口,一类是删除了对象入口。
如00000003 65536 f,该对象对应<free entry>,是已删除的入口。那它的 生成号为什么会是65536,又为什么会这么大?
 
写这篇文帖子的时候还不不懂,现在有些明白了。答案是,该条入口的生成号(generation)是从00000开始,每次删除之后又再次使用,则此号+1,如第四条入口,生成号为00007,表示这个入口代表的对象已经被删除后又在使用了7次。另外,当生成号达到65536时,该条记录,就不能给使用了;还有第0号记录,总是空的,生成号生下来就是65536,不给使用。
 
关于对象号的问题。
第一条入口代表的对象号是从<object number of first enctry in subsection>开始计数,此处是0,就从0开始,六条记录的对象号依次是0、1、2、3、4、5。其中第0、3号对象被删除,第1、2、4、5号对象在使用。
 
载举例说明对象号:
xref
0 1
00000017 65536 f
3 2
00000431 00000 n
00000931 00000 n
30 3
00001031 00000 n
00001531 00000 n
00001931 00000 n
 
此类中,有3个交叉子表。
第一个子表有1条记录,对象号从0开始。
第二个子表有2条记录,对象号从3开始,两条记录代表的对象号依次是3、4。
第三个子表有3条记录,对象号从30开始,三条对象的对象号依次是30、31、32。
 
子表之间,对象号不一定连续。
 
那么剩下来的问题就是:
PDF文档如何通过交叉参考表来访问对象?