生成线性化 PDF 时,交叉引用表应存储在文件的最开头。如果是交叉引用流,这意味着表的内容将被压缩,压缩后交叉引用流的实际大小是不可预测的。
所以我的问题是:如何提前确定这个交叉引用流的实际大小?如果流的实际大小是不可预测的,那么在对象的偏移量被写入流中并且流被写入文件之后,它会再次改变后面对象的实际偏移量,不是吗?我在这里想念什么吗?
任何提示表示赞赏。
生成线性化 PDF 时,交叉引用表应存储在文件的最开头。如果是交叉引用流,这意味着表的内容将被压缩,压缩后交叉引用流的实际大小是不可预测的。
所以我的问题是:如何提前确定这个交叉引用流的实际大小?如果流的实际大小是不可预测的,那么在对象的偏移量被写入流中并且流被写入文件之后,它会再次改变后面对象的实际偏移量,不是吗?我在这里想念什么吗?
任何提示表示赞赏。
如何提前确定这个交叉引用流的实际大小?
首先你没有。至少不完全是。你描述了原因。
但有一个估计就足够了。只需在估计值中添加一些字节,然后用空格填充。@VadimR 指出,可以在线性化 PDF 中定期观察到这种填充。
您可以使用引用的 QPDF 源 @VadimR 中的粗略估计,也可以尝试使用更好的估计。
例如,您可以使用预测器:
在您最终必须创建交叉引用流时,所有 PDF 对象都可以按照您需要的顺序进行序列化,但交叉引用流和线性化字典(其中包含 PDF 的最终大小和一些对象偏移)除外)。因此,您已经知道大多数条目的连续外部参照条目值之间的差异。
如果你用完预测变量,你基本上只存储这些差异。因此,您已经知道要压缩的大部分数据。一些条目的更改不会对压缩结果产生太大影响。所以这可能会给你一个更好的估计。
此外,由于第一个交叉引用流通常不包含太多条目,您可以尝试多次压缩该流以获得不同数量的保留字节。
PS:我不知道 Adobe 在他们的线性化代码中使用了什么。而且我不知道在这里或多或少地争取几个字节是否有意义;毕竟线性化对于几乎不计几个字节的大文档来说是最明智的。