【问题标题】:Why are PDF files different even if the content is the same?为什么即使内容相同,PDF文件也不同?
【发布时间】:2013-12-01 03:00:32
【问题描述】:

“创建 PDF 的方法通常不止一种 在 PDF 查看器中打开时看起来像同卵双胞胎的文档。而且即使你 使用完全相同的代码创建两个相同的 PDF 文档,会有细微差别 在两个结果文件之间。这是 PDF 格式所固有的。”

我在“Itext in action-second edition”中读到了这一段。(第 17 页)。谁能解释一下作者在谈论什么样的差异。如果我可以说,为什么 pdf 格式有这个缺陷的原因。

【问题讨论】:

  • 我不知道技术原因,但它可能只是归结为一切是如何处理然后渲染的。差异可能只是对齐和位置/间距的问题。
  • 为什么pdf格式有这个缺陷 - 首先这不是一个缺陷,而仅仅是pdf的一个属性。话虽如此,pdf 只是一种非常灵活的格式,允许您以不同的方式描述相同的内容。此外,它还包含工作流信息和旨在用于识别目的的唯一 ID。
  • 不,我认为这是一个缺陷。如果用户希望 pdf 看起来完全相似怎么办。我知道 pdf 的优点。我只是考虑了该声明中的情况。
  • “相同的代码 = 小的差异”只能表示 trailerIDInfoCreationDate 条目——如果它们是自动放在那里的。否则就没有意义。
  • 您还可以在字体文件中获取时间戳。

标签: pdf pdf-generation


【解决方案1】:

在不同时刻创建的文件,CreationDate 具有不同的值,并且它们具有不同的文件标识符(在不同时刻创建的两个文件应该具有不同的 ID,如 PDF 中所定义规范)。

文件标识符通常是根据日期、路径名、文件大小、PDF 文件的部分内容(例如信息字典中的条目)创建的哈希值。我引用 ISO-32000-1:

文件标识符的计算不需要是可重现的;全部 重要的是标识符可能是唯一的。为了 例如,上述算法的两种实现可能使用 当前时间的不同格式,导致它们产生 同时创建的同一文件的不同文件标识符, 但不影响标识符的唯一性。

加密文档时必须使用文件标识符,因为它们用于加密过程。因此,具有不同文件标识符的加密 PDF 文件将具有完全不同的流。这不是缺陷,这是设计使然。我是致力于 PDF 2.0 规范的 ISO 委员会的成员,我可以向您保证,没有计划改变这一点。即使使用相同的代码,在不同时间点创建的文件也会有所不同。 (我也是你提到的那本书的作者。)

ISO 规范还允许其他差异。 例如:用于在页面上显示图形和文本的语法可以出于任何原因重新组织。 请参阅 ISO-32000-1 的第 8.2 节,其中说:

重要的一点是图形状态操作符的确切排列没有语义意义。 PDF 内容流的合格读取器或写入器可能会更改图形状态运算符的排列 到为每个图形对象实现相同的相关图形状态参数值的任何其他安排。

在处理 PDF 内容流时,PDF 处理器可能会更改图形的排列 状态运算符到实现相关图形状态相同值的任何其他安排 每个图形对象的参数。这样做可以优化页面,使其渲染更快, 为了更容易调试、改进压缩或出于任何其他原因。

两个看似相同的 PDF 内部可能不同的另一个原因与 PDF 字典有关。 字典中键的顺序在 PDF 中没有任何重要性。 例如,实现规范的软件将使用HashMap 来描述键/值对。 根据 JVM,相同的代码可能会导致两个 PDF 的字典在语义上相同, 但其中的条目以不同的方式排序。这不是错误。这完全符合 ISO-32000-1。

重要提示:使用相同代码但在不同时刻创建的两个 PDF 文件之间的内部差异可能不会导致在 PDF 查看器中打开文档或打印纸上的文件。

【讨论】:

  • 谢谢洛瓦吉先生。因此,简而言之,基于文档的创建日期生成的文件标识符是不同的,因此这些文件是不同的。您能否指出这些文档可能存在的差异类型?尤其是视觉差异。
  • 我不确定如何解释“视觉差异”。我已经更新了我的答案。在文本编辑器中查看文件时会有视觉差异,但在 PDF 查看器中查看文件时不应有任何视觉差异。
【解决方案2】:

除了其他答案,别忘了在编程中总是有不同的方法来完成相同的结果。想想 HTML5 何时出现。

<script>
   alert("Hey");
</script>

相对于使用 JS 的旧方式....

<SCRIPT type="text/javascript">
  alert("Hey");
</script>

并不是说总是有不同的方法可以产生相同的效果,两个不同的人会使用两种不同的方法。这就是创建 REST API 的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2019-10-03
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多