【发布时间】:2014-06-04 18:45:56
【问题描述】:
生成线性化 PDF 时,交叉引用表应存储在文件的最开头。如果是交叉引用流,这意味着表的内容将被压缩,压缩后交叉引用流的实际大小是不可预测的。
所以我的问题是: 如何提前确定这个交叉引用流的实际大小? 如果流的实际大小是不可预测的,那么在对象的偏移量被写入流中并且流被写入文件之后,它会再次改变后面对象的实际偏移量,不是吗?我错过了什么吗?
感谢任何提示。
【问题讨论】:
-
它会改变后面对象的实际偏移量——这就是为什么这样的交叉引用流通常只包含对它之前的对象的引用。即使在线性化 PDF 中,每个交叉引用表或流通常也只引用前面的对象。
-
这适用于普通的引用表,它通常只引用前面的对象。但在线性化 PDF 中,第一页、目录等对象的引用表直接遵循线性化字典,该字典位于它引用的对象之前。这就是为什么它让我感到困惑。
-
嗯。我必须查看这样的文件才能确定,但实现这一目标的一种方法可能是使用带有适当预测器的压缩。这将使要压缩的数据事先知道,但第一个偏移量除外。这可以使压缩流的长度可预测。
-
我检查了很多线性化的pdf,通常在XRefStream中使用Predictor 12(PNG Up),但我不明白为什么使用预测器可以预测压缩数据的大小?你能解释得更详细一点吗?提前致谢!
-
我用 XRefStream(从 Acrobat 中保存)检查了一些线性化的 PDF,所有的第一个 XRefStream 字典周围都有一些空白填充。实际上,例如QPDF 源代码,名为
calculateXrefStreamPadding的方法具有您可能感兴趣的cmets。事实上,使用 QPDF 工具保存的文件中的填充非常巨大。
标签: pdf pdf-generation pdf-parsing