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