在CI服务器上生成的PDF无法通过审批测试

时间:2016-08-07 20:29:59

标签: .net teamcity migradoc approval-tests

我正在尝试使用ApprovalTests.NET来测试基于MigraDoc的一些(主要是遗留的)PDF生成代码。正在测试的代码将PDF呈现为MemoryStream,然后擦除各种元数据属性(使用我从PdfScrubber改编的代码),转换为字节数组并使用Approvals.VerifyBinaryFile()进行验证。

测试通过我的机器和同事(都运行Windows 10),但在我们的TeamCity构建代理(Azure VM,运行Windows Server 2012 R2)上失败了。比较Received文件(在构建服务器上生成)和Approved文件(在我的机器上生成),文件的元数据部分是相同的,但二进制部分完全不同,一个文件比另一个文件短约1 kb

可能导致这种差异的原因是什么?它可能与操作系统有关吗?

修改

问题似乎是字体(感谢PDFSharp Expert提供的建议)。仔细观察有两个不同的二进制对象,这些显然定义了标题和正文字体:当我删除一个然后另一个时,标题和正文分别变成点。

那么,有没有办法保证所有机器都会产生与字体相同的输出?到目前为止,我已经尝试过:

  • PdfFontEmbedding.None传递给PdfDocumentRenderer的构造函数(以前使用的是PdfFontEmbedding.Always
  • 设置如下私有字体:

        var fonts = new XPrivateFontCollection();
        var arial = File.ReadAllBytes("path/to/arial/copied/from/windows/server.ttf");
        fonts.AddFont(arial, "Arial");
        XPrivateFontCollection.SetGlobalFontCollection(fonts);
    

在这两种情况下,我都在本地机器上获得与以前相同的输出。

1 个答案:

答案 0 :(得分:1)

如果没有看到有问题的PDF文件,我只能推测。

用于PDF的TTF文件可能因操作系统而异,这可能会影响文件大小。

使用框架/操作系统代码读取非JPEG图像,因此尺寸差异也可能来自图像。

PDF文件包含许多对象。 PDFsharp可以创建有些人类可读的详细PDF文件(这是DEBUG模式的默认值)。使用DEBUG构建运行测试并比较PDF文件以查看哪些对象有助于大小差异。