我们在我们的一个 Web 应用程序中使用 PDFSharp(GDI+ 版本)。在一个 PDF 导出器中,我们使用的是非系统 truetype 字体,它在我们的开发环境中就像一个魅力,但是当我们在生产环境中运行它时会崩溃。
我们的开发和生产之间的主要区别(我认为)是我们的生产服务器在 Windows Server 2008 64 位上运行,而我们的开发在 2008 32 位上运行。我写了一个小测试程序来调试。
try
{
new XFont("ocrb10", 10, XFontStyle.Regular, new XPdfFontOptions(PdfFontEncoding.Unicode, PdfFontEmbedding.Always));
}
catch (Exception exc) { Console.WriteLine(exc.StackTrace); }
错误消息是 InvalidOperationException:内部错误。无法检索字体数据。
at PdfSharp.Fonts.OpenType.FontData.CreateGdiFontImage(XFont font, XPdfFontOptions options)
at PdfSharp.Fonts.OpenType.FontData..ctor(XFont font, XPdfFontOptions options)
at PdfSharp.Fonts.OpenType.OpenTypeDescriptor..ctor(XFont font, XPdfFontOptions options)
at PdfSharp.Fonts.OpenType.OpenTypeDescriptor..ctor(XFont font)
at PdfSharp.Fonts.FontDescriptorStock.CreateDescriptor(XFont font)
at PdfSharp.Drawing.XFont.get_Metrics()
at PdfSharp.Drawing.XFont.Initialize()
at PdfSharp.Drawing.XFont..ctor(String familyName, Double emSize, XFontStyle style, XPdfFontOptions pdfOptions)
我从源代码构建了 PDFSharp 并添加了一些调试代码以了解发生了什么。问题是对 GetFontData 的 pinvoke 调用返回-1 (GDI_ERROR)。PdfSharp 作者在发生错误的FontData.cs中添加了对此的评论(搜索 GDI_ERROR),但他也没有找到合适的解决方案。
// Line 138 in FontData.cs, this GetFontData returns -1 here when
// running as a web application on a 64bit windows host (regardles of WOW64
// being enabled or not)
int size = NativeMethods.GetFontData(hdc, 0, 0, null, 0);
现在,对我来说,问题是当我将代码作为控制台应用程序运行时,我无法在任何环境中重现此错误。我尝试为应用程序池打开和关闭 WOW64,并尝试在我自己的凭据下运行应用程序池,以防出现任何与权限相关的问题,但无济于事。
顺便说一句,PDFSharp 的 WPF 构建效果很好,如果我们找不到任何解决方案,我们很可能会切换到它,但我真的很好奇是什么原因造成的。
谁能帮我进一步调试步骤?在 IIS/ASP.NET 中运行的环境与在 PInvokes 中运行的控制台应用程序有何不同?