iText使用相同的代码生成不同的PDF

时间:2018-07-31 20:55:28

标签: pdf itext

我正在尝试使用iText为pdf生成代码编写单元测试。但是我发现iText生成的文件的二进制文件略有不同。我猜这是由于元数据(例如创建时间)造成的。

我想知道我的猜测是否正确。还有如何手动设置元数据。非常感谢。

1 个答案:

答案 0 :(得分:1)

如果将创建时间添加到PDF的元数据中,则在同一时间使用相同代码创建的两个PDF之间会有差异,因为创建时间会有所不同。这就是PDF不同的原因之一。

元数据是可选的,因此您可以选择省略所有元数据(使用iText很难做到,因为iText 总是添加元数据)。但是,即使在这种情况下,也会存在差异。

从PDF 2.0开始,必须有一个区别。在PDF规范的早期版本中,已经引入了每个PDF的唯一ID的概念。此唯一ID由两个值的数组组成,当从头开始创建PDF时,这两个值相同。如果操作了PDF,则ID的第一个值将保持不变,而第二部分将更改。在PDF 2.0之前,此ID对是可选的,尽管许多PDF创建者都会添加它。从PDF 2.0开始,必须使用这样的ID对,并且不应使用同一ID创建两个不同的PDF。实际上,通过创建不同参数的消息摘要来创建此类ID对的值,通常包括当前时间,以确保在不同时间创建的两个PDF的ID不同。

时间戳也可以使用,例如创建数字签名时。另一个不同之处可能取决于您用来创建PDF的技术或编程语言。例如:在创建PDF的过程中,一些哈希集填充有对象列表。然后将这些对象以可能不同的顺序写入PDF文件,具体取决于顺序在哈希集中无关紧要。从哈希集中接收对象的顺序取决于很多事情,通常很难预测(请参见Java中ArrayListTreeSetHashSet之间的区别)。

例如:如果您有一个对象为“ apple”,“ pear”,“ banana”的无序列表,并将此无序列表写入文件,则这些对象可以按6种不同的顺序出现在文件中:

  1. 苹果,梨,香蕉
  2. 苹果,香蕉,梨
  3. 梨,苹果,香蕉
  4. 梨,香蕉,苹果
  5. 香蕉,苹果,梨
  6. 香蕉,梨,苹果

假设这些对象不是结果,而是PDF中的对象,那么6个不同顺序中的任何一个都将产生有效的PDF语法。