为什么同一自动化流程生成的pdf在不同的机器上会有所不同?

时间:2014-05-27 19:54:23

标签: pdf

我有一个生成pdfs which we then compare to a known version via approval tests的自动化流程,以验证该管道中没有任何内容被破坏。 I normalize mismatching fields喜欢创建/修改日期和时区,本地所有内容总是匹配100%。但是出于某种原因,在我们的构建服务器上生成的pdfs 非常与我在本地生成的那些不同,有时我在本地生成的那些大大增加了20%。

比较winmerge中的文件时的第一个区别是/FontName字段,如下所示:

本地生成

/FontName/QOAAAA+TimesNewRomanRegular

构建服务器生成

/FontName/QYAAAA+TimesNewRomanRegular

之后我们在/FontBBox,长度和二进制数据方面存在差异。我看到了几个块。

我怀疑在这两台机器上可以选择稍微不同的字体,并将其嵌入到pdf中,但我不知道上面的Q*AAAA代码是什么意思,也不知道如何验证这个假设。

修改

pdffonts报告两者中的相同字体,但不能只是相同嵌入字体的不同版本?

W:\xpdfbin-win-3.03\bin64> .\pdffonts.exe w:\...\PhantomRasterizer\Can_rasterize_html_to_pdf.slide_with_table_and_svg.approved.pdf
name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
TimesNewRomanRegular                 CID TrueType      yes no  yes      7  0
ArialBold                            CID TrueType      yes no  yes     12  0
ArialRegular                         CID TrueType      yes no  yes     17  0
W:xpdfbin-win-3.03\bin64> .\pdffonts.exe W:\...\PhantomRasterizer\Can_rasterize_html_to_pdf.slide_with_table_and_svg.received.pdf
name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
TimesNewRomanRegular                 CID TrueType      yes no  yes      7  0
ArialBold                            CID TrueType      yes no  yes     12  0
ArialRegular                         CID TrueType      yes no  yes     17  0

1 个答案:

答案 0 :(得分:1)

请阅读我对此问题的回答:Why are PDF files different even if the content is the same?

您的问题相当于"为什么HashMap中的条目顺序在不同的JVM上有所不同?"答案很简单:因为HashMap是这样设计的。 HashMap不是TreeMap

您现在专注于字体,更具体地说是字体子集(关于字体子集ISO-32000-1的名称中的随机字符状态"字母的选择是任意的",所以你&#39 ;在你的问题中重新参加ISO标准)。但是,这是你遇到的麻烦中最少的。 PDF的ID也应该不同,字典中的条目顺序类似于HashMap中的条目。阅读ISO-32000-1的7.3.7部分:

  

字典中的条目表示关联表,因此   即使可能施加任意命令,也应无序   它们写在文件中时。那个顺序应该被忽略。

对象编号也是如此。我已经看过测试,检查对象编号为1的对象是否是该字典,对象编号为2的对象是该数组还是该数组。但是:对象编号并不重要。您可以在一个系统中创建PDF文档,其中第一个对象是字典,第二个对象是数组,而相同的PDF文档使用相同的代码,其中相反的方式。我们最近注意到,在使用Java 8而不是Java 7测试我们的软件时,我们的一个测试很糟糕。一旦更改JVM,您的测试就会遇到同样的问题。

您的验证错误。当我们测试PDF时,我们使用完全不同的方法。