我有一个生成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
答案 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时,我们使用完全不同的方法。