【发布时间】:2019-06-27 13:14:29
【问题描述】:
我正在尝试读取一个线性化并使用交叉引用流的 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 预测函数(向上),它产生 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 规范中没有找到任何关于对外部参照流的最后两行进行特殊处理的内容。我错过了什么?
【问题讨论】:
-
你能贴一个 PDF 文件的链接吗?
-
您解释预测器以添加当前输入行和前一个输入行以检索当前数据行。您不应该添加当前输入行和上一个数据行吗?这将改变对象 3 的结果。
-
@mkl 这就是我认为我所做的。我的帖子显示了应用 PNG 预测器的前后。在“之前”数据中,每一行都有一个预测变量 0x02。在“之后”行中,没有预测字节,因为预测已经完成。
-
@MihaiIancu 我今天无法发布 PDF 链接;我正在努力获得这样做的许可,但我不是数据的所有者。但是,此链接 (pastebin.com/521k2yGD) 会指向一个页面,其中包含仅与文件结构和交叉引用流相关的数据。我希望它有用。谢谢。
标签: pdf stream ref cross-reference