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

时间:2019-06-27 13:14:29

标签: pdf stream ref cross-reference

我正在尝试读取线性化并使用交叉引用流的PDF文件。我相信除了表格中的最后两个条目外,我基本上都了解发生了什么。对于对象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 Predictor函数(向上),该函数产生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,告诉我该表应包含对象0到6的数据。过滤后,我有28个字节的数据,这对于7行每个四个字节。

为什么根本没有5和6的条目?而且,鉴于它们在那里,为什么将它们标记为“正在使用”且带有明显无意义的偏移量?

文件似乎有效。 Adobe Illustrator和Acrobat Reader均打开它而没有任何投诉。在PDF规范中,我没有找到任何有关Xref流最后两行的特殊处理的信息。我想念什么?

1 个答案:

答案 0 :(得分:1)

您解释预测变量以添加当前输入行和上一个输入行以检索当前数据行。您不应该添加当前输入行和上一个数据行吗?这将改变对象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将被标记为对象流中的对象。