我正在尝试 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.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);
在这两种情况下,我在本地机器上都得到了与以前相同的输出。