私は ApprovalTests.NET を試して、MigraDoc でビルドされた PDF 生成コード (ほとんどがレガシー) をテストしています。テスト対象のコードは、PDF を MemoryStream にレンダリングします。その後、さまざまなメタデータ プロパティがスクラブされ (から適用したコードを使用PdfScrubber
)、バイト配列に変換され、 を使用して検証されますApprovals.VerifyBinaryFile()
。
私のマシンと同僚のマシン (両方とも Windows 10 を実行) ではテストに合格しますが、TeamCity ビルド エージェント (Azure VM、Windows Server 2012 R2 を実行していると思います) では失敗します。受信ファイル (ビルド サーバーで生成) と承認済みファイル (私のマシンで生成) を比較すると、ファイルのメタデータ部分は同じですが、バイナリ部分は完全に異なり、一方のファイルはもう一方のファイルよりも約 1 kb 短くなっています。 .
不一致の原因は何ですか?OS関連の可能性はありますか?
編集
問題はフォントにあるようです (提案については PDFSharp Expert に感謝します)。よく調べてみると、異なる 2 つのバイナリ オブジェクトがあり、これらは明らかにヘッダーと本文のフォントを定義しています。1 つを削除してからもう 1 つを削除すると、ヘッダーと本文のテキストがそれぞれドットに変わります。
では、すべてのマシンがフォントに関して同じ出力を生成することを保証する方法はありますか? これまでのところ、私は試しました:
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);
どちらの場合も、ローカル マシンで以前と同じ出力が得られます。