PDF 的 Xref 表(交叉引用表)是 PDF 文件格式中非常重要的一个特性,它使得 PDF 文件具有灵活性。Xref 表位于 PDF 文件的尾部,通常可以在最后 1024 个字节中找到。一个 PDF 文件可以包含多个链接的 Xref 表,而每个 Xref 表都需要被读取。线性化 PDF 文件在文件开头包含一些额外的数据,这样即使文件没有完全读取,用户也可以先查看文件的内容。
如果你用文本编辑器打开一个 PDF 文件并搜索“xref”,你可能会看到类似以下的内容:
xref
0 271
0000000000 65535 f
0000000015 00000 n
0000000102 00000 n
这就是 Xref 表。PDF 文件由大量的 COS 对象组成,Xref 表告诉你每个对象的位置。这对于 PDF 阅读器非常有用,因为它只需要根据这些位置来加载需要的对象,而不必一次性解析或加载整个文件。这样,文件的加载和查看更加高效。
在上面的例子中,第一行说明了表项的数量和对象编号,从 0 开始,共有 271 项。接下来的行则列出了每个对象的偏移量、生成编号(表示对象的不同版本)以及一个标志,说明该对象是“在用”(n)还是“不在用”(f)。如果 PDF 文件被编辑并修改了某些对象,新的对象通常会被附加到文件中,并更新 Xref 表指向新的位置。因此,一个 PDF 文件可能包含多个 Xref 表,并且后面的 Xref 表中的值会被使用。
如果你查看这个 PDF 文件中的第 15 字节(如上面的例子所示),你会发现对象 1 的开始位置是 1 0 obj,这通常是一个字体对象的定义(如 <</Type/Font ...)。
对于 PDF 1.5 版本及以上的文件,你可能看不到传统的 Xref 表,因为它们引入了一种新的方式来存储对象,这些对象被压缩存储在流中。
Xref 表也解释了为什么如果你修改 PDF 文件中的某个字节或添加字节,文件会变得损坏——因为此时所有的指针都不再正确。
有没有简单的方式来查看 PDF 的 Xref 表?
我们开发的 Java PDF 查看器具有“检查模式”,可以用来查看 Xref 表并查看它们指向的数据。这一功能即使在试用版中也能使用(所以你不需要购买软件就能体验)。
我们的主页:PDF 转 HTML5、Java 图像库、Java PDF SDK - IDRsolutions
我们的公众号:IDRSolutions