0

我正在尝试 ApprovalTests.NET 来测试基于 MigraDoc 构建的一些(主要是旧版)PDF 生成代码。被测代码将 PDF 呈现为 MemoryStream,然后清除各种元数据属性(使用我改编自 的代码PdfScrubber),转换为字节数组并使用Approvals.VerifyBinaryFile().

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

什么可能导致差异?它可能与操作系统有关吗?

编辑

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

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

  • 传递PdfFontEmbedding.NonePdfDocumentRenderer(以前它使用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);
    

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

4

1 回答 1

1

在没有看到有问题的 PDF 文件的情况下,我只能推测。

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

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

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

于 2016-08-08T07:39:14.910 回答