"通常有多种方法可以创建PDF 在PDF查看器中打开时看起来像同卵双胞胎的文档。即使你 使用完全相同的代码创建两个相同的PDF文档,会有很小的差异 两个结果文件之间。这是PDF格式所固有的。"
我在" Itext in action-second edition"。(p 17)中读到了这一段。任何人都可以解释一下作者所说的是什么样的差异。以及pdf格式的原因如果我可以说,有这个缺陷。
答案 0 :(得分:7)
在不同时刻创建的文件对CreationDate
具有不同的值,并且它们具有不同的文件标识符(具有两个文件,在不同时刻创建,应该具有不同的ID
as在PDF规范中定义。)
文件标识符通常是基于日期,路径名称,文件大小,PDF文件的部分内容(例如,信息字典中的条目)创建的散列。我引用ISO-32000-1:
文件标识符的计算无需重现;所有 重要的是标识符可能是唯一的。对于 例如,前面算法的两个实现可能会使用 当前时间的不同格式,导致它们产生 同时创建的同一文件的不同文件标识符, 但标识符的唯一性不受影响。
加密文档时,文件标识符是必需的,因为它们在加密过程中使用。因此,具有不同文件标识符的加密PDF文件将具有完全不同的流。这不是一个缺陷,这是设计的。我是ISO委员会的成员,正致力于PDF 2.0规范,我可以向您保证,没有计划改变这一点。即使使用相同的代码,在不同时间点创建的文件也会有所不同。 (我也是你所提到的那本书的作者。)
ISO规范还允许其他差异。 例如:用于在页面上显示图形和文本的语法可以出于任何原因重新组织。 参见ISO-32000-1的8.2节,其中说:
重要的是,对图形状态运算符的精确排列没有语义意义。 PDF内容流的一致读取器或写入器可以改变图形状态操作符的排列 任何其他安排,以实现每个图形对象的相关图形状态参数的相同值。
处理PDF内容流时,PDF处理器可能会更改图形排列 状态运算符到达到相关图形状态的相同值的任何其他排列 每个图形对象的参数。这样做可以优化页面,使其更快地渲染, 使其更容易调试,改进压缩,或出于任何其他原因。
两个看似相同的PDF可能在内部有所不同的另一个原因是PDF字典。
字典中键的顺序在PDF中没有任何重要性。
实现该字母规范的软件将使用HashMap
到故事键/值对。
根据JVM,相同的代码可以生成两个PDF,其中字典在语义上相同,
但其中的条目以不同的方式排序。这不是错误。这完全符合ISO-32000-1。
重要提示:使用相同代码创建的两个PDF文件之间的内部差异,但在不同的时刻,在PDF查看器中打开文档或打印时可能不会产生视觉差异文件在纸上。
答案 1 :(得分:0)
除了其他答案之外,不要忘记在编程中总会有不同的方法来完成相同的结果。想一想HTML5何时到达现场。
<script>
alert("Hey");
</script>
与旧的使用JS的方式....
<SCRIPT type="text/javascript">
alert("Hey");
</script>
只是并不总是有不同的方法来产生相同的效果,而两个不同的人会使用两种不同的方法。这就是创建REST API的原因。