尝试理解 PDF 中交叉引用 (XRef) 流中的数据

Trying to understand data in cross-reference (XRef) stream in PDF

我正在尝试读取线性化并使用交叉引用流的 PDF 文件。我相信除了 table 中的最后两个条目外,我基本上了解发生了什么。对于对象 5 和 6,这两个文件似乎正在使用,但显示的文件偏移量大大超过了文件大小。此外,我的 PDF 文件中甚至没有对象编号 5 或 6。

这是交叉引用流:

4 0 obj
<</DecodeParms<</Columns 4/Predictor 12>>/Filter/FlateDecode/ID[<ED772C59D33BA74FA1DEE567740067A0><ED772C59D33BA74FA1DEE567740067A0>]/Info 6 0 R/Length 39/Root 8 0 R/Size 7/Type/XRef/W[1 3 0]>>stream

hfibb&F…ˆl&fit ¡ÿ"∏ôügÕ≤=‘

endstream


这里是FlateDecode后的原始数据,按行排列。 FlateDecode 报告 35 个字节的数据被夸大了。

02 00 00 00 00
02 01 19 87 6b
02 00 00 0d 67
02 00 00 01 8c
02 00 00 01 0b
02 01 e7 6a 99
02 00 00 00 01

我还应用了一个 PNG 预测器函数(向上),它产生了 7 行,每行 4 个字节:

00 00 00 00
01 19 87 6b
01 19 94 d2
00 00 0e f3
00 00 02 97
01 e7 6b a4
01 e7 6a 9a

第 0 行全为零,请检查。对象 1 和 2 的偏移量实际上是针对 PDF 文件中的对象 1 和 2。到目前为止,一切都很好。对象 3 标记为未使用,PDF 文件中肯定没有对象 3。

但是,我对对象 4(这个交叉引用流)被标记为未使用感到有点困惑。尽管如此,由于我正在解析的是对象 4,所以我显然很容易找到它。
但是我完全困惑的是对象 5 和 6 的行。第一列中的“01”告诉我它们正在使用中。但是他们的偏移量超过了整个文件的大小,无论如何,文件中没有对象5和6。字典中的 Size 条目显然值为 7,告诉我 table 应该包含对象 0 到 6 的数据。过滤后,我有 28 个字节的数据,这对于每行四个字节的七行是有意义的。

为什么那里有 5 和 6 的条目?而且,既然它们在那里,为什么将它们标记为 "in use" 并带有明显无意义的偏移量?

该文件似乎有效。 Adobe Illustrator 和 Acrobat Reader 毫无怨言地打开它。我没有在 PDF 规范中找到任何关于对外部参照流的最后两行进行特殊处理的内容。我错过了什么?

您将预测器解释为添加当前输入行和前一个输入行以检索当前数据行。您不应该添加当前输入行和上一个数据行吗?这将改变对象 3 之后的结果:

02 00 00 00 00    00 00 00 00
02 01 19 87 6b    01 19 87 6b
02 00 00 0d 67    01 19 94 d2
02 00 00 01 8c    01 19 95 5e
02 00 00 01 0b    01 19 96 69
02 01 e7 6a 99    02 00 00 02
02 00 00 00 01    02 00 00 03

现在对象 3 和 4 具有与您的 pastebin 粘贴中的数据相匹配的适当偏移量,并且对象 5 和 6 将被标记为对象流中的对象。