PDF文件应有以下四个元素构成:
1)一行文件头,标识文件所符合的PDF规范版本。
2)正文,包含了组成文件中所含文档的对象。
3)一个交叉引用表,包含关于文件中间接对象的信息。
4)尾注提供交叉引用表和文件正文某些特殊对象的位置。
1,文件头,PDF 文件的第一行应是一个文件头,包含 5 个字符 %PDF- ,后跟 1.N 形式的版本号,其中 N 是 0 到7 之间的数字。
如果 PDF 文件包含二进制数据,大多数文件都是这样,那么文件头行之后应紧跟一个注释行,其中包含至少 4 个二进制字符,即编码大于或等于 128 的字符。这可以确保文件传输应用程序采取正确的行为来检查文件开头附近的数据,以确定将文件内容视为文本还是二进制数据。
2,正文,PDF 文件的正文应包含一个间接对象序列,表示文档的内容,表示文档中的字体、页面和采样图像等组件。
3,交叉引用表,交叉引用表包含的信息允许对文件中的间接对象进行随机访问,所以不需要读取整个文件来查找任何具体对象。该表应为每个间接对象包含一个一行的条目,指定该对象在文件正文中的字节偏移。该表包含一个或多个交叉引用部分。最初,整个表仅包含一节(如果文件是线性化的,则包含两节 )。在每次对文件进行增量更新(见附录1)时应添加额外一节。
每个交叉引用节应以一个包含关键字 xref 的行开始。此行之后应是一个或多个交叉引用子节,它们可以按任何顺序显示。对于从未增量更新过的文件,交叉引用节应仅包含一个子节,其对象编号从 0 开始。每个交叉引用子节应包含针对一个连续范围内的对象编号的条目。
每个条目占一行。每个条目应为 20 字节长,包括行结束标记。
条目类型:一种用于正在使用的对象(关键字n标识)和用于已删除的(因此是自由的)对象(关键字f标识)。
条目格式:nnnnnnnnnn ggggg n eol;nnnnnnnnnn 应为解码流中的 10 位字节偏移,ggggg 应为一个 5 位代号,N 应是关键字,表示这是一个正在使用的条目,Eol 应是一个 2 字符行结束序列。见示例:
它包含一个有 6 个条目的子节: 4 个正在使用(对象编号 1 、 2 、 4 和 5 ),两个是自由的(对象编号 0 和 3 )。对象编号 3 已删除,使用该对象编号创建的下一个对象使用代号 7 。
xref
06
0000000003 65535 f
0000000017 00000 n
0000000081 00000 n
0000000000 00007 f
0000000331 00000 n
0000000409 00000 n
4,尾注,文件的最后一行应仅包含文件结束标记 %%EOF 。其前面两行应依次包含关键字 startxref 和解码流中从文件开始到最后一个交叉引用节中的 xref 关键字开始为止的字节偏移(一行包含一个)。 startxref 行前面应是尾注字典,包含关键字 trailer 及后面一系列包含在双
尖括号(<<… >>)[使用 LESS-THANSIGNs ( 3Ch )和 GREATER-THANSIGNs ( 3Eh )]中的键 - 值对。
尾注字典条目:
1)Size:文件交叉引用表中的条目总数。
2)Prev:解码流中从文件开头到前面的交叉引用节开头的字节偏移。上一个交叉引用表的位置。
3)Root:文件中包含的 PDF 文档目录字典。
4)Encryt:文档的加密字典。
5)Info:文档的信息字典。
6)ID:一个两字节串的数组,它们组成文件的文件标识符。
附录一,增量更新,PDF 文件的内容可以进行增量更新,无需重写整个文件。当增量更新 PDF 文件时,更改应附加到文件末尾,不改动其原始内容。增量更新的交叉引用节应包含仅对应于已更改、替换或删除的对象的条目。删除的对象在文件中应处于未更改状态,但通过它们的交叉引用条目标应记为已删除。增加的尾注应包含以前的尾注中除Prev 条目(如果有)外的所有条目,无论是否经过修改都是如此。此外,添加的尾注字典包含一个 Prev条目,它提供了以前交叉引用节的位置。