使用PDFSharp时,在Azure Web应用程序中访问字体时出错



我使用PDFSharp在我的web应用程序中动态生成PDF。web应用程序在本地工作良好,但是,当我将应用程序推送到Azure(作为web应用程序)时,我得到以下例外:

{"message":"An error has occurred.","exceptionMessage":"Internal error. Font data could not retrieved.","exceptionType":"System.InvalidOperationException","stackTrace":" at PdfSharp.Fonts.OpenType.FontData.CreateGdiFontImage(XFont font, XPdfFontOptions options)rn at PdfSharp.Fonts.OpenType.FontData..ctor(XFont font, XPdfFontOptions options)rn at PdfSharp.Fonts.OpenType.OpenTypeDescriptor..ctor(XFont font, XPdfFontOptions options)rn at PdfSharp.Fonts.OpenType.OpenTypeDescriptor..ctor(XFont font)rn at PdfSharp.Fonts.FontDescriptorStock.CreateDescriptor(XFont font)rn at PdfSharp.Drawing.XFont.get_Metrics()rn at PdfSharp.Drawing.XFont.Initialize()rn at PdfSharp.Drawing.XFont..ctor(String familyName, Double emSize)rn at Spiro.Services.OrderService.GetOrderLabel(Int32 id, Nullable`1 quantity)rn at Spiro.Web.Controllers.WebApi.V1.OrderController.GetOrderLabel(Int32 id, Nullable`1 quantity)rn at lambda_method(Closure , Object , Object[] )rn at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.b__9(Object instance, Object[] methodParameters)rn at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)rn at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)rn--- End of stack trace from previous location where exception was thrown ---rn at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)rn at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)rn at System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()rn--- End of stack trace from previous location where exception was thrown ---rn at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)rn at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)rn at System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext()rn--- End of stack trace from previous location where exception was thrown ---rn at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)rn at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)rn at System.Web.Http.Controllers.AuthenticationFilterResult.d__0.MoveNext()rn--- End of stack trace from previous location where exception was thrown ---rn at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)rn at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)rn at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()"}

我创建的文本如下:

var document = new PdfDocument();
var page = document.AddPage();
var gfx = XGraphics.FromPdfPage(page);
var font = new XFont("Calibri", 30);

gfx.DrawString(rows[i], font, XBrushes.Black,
    new XPoint(XUnit.FromMillimeter(10),
               XUnit.FromMillimeter(10)),
               XStringFormats.TopLeft);

我可以看到Azure服务器安装了一堆字体-我被困在问题是什么…提前感谢您的帮助

Azure应用服务(又名Azure网站)实施了许多比云服务或IaaS (vm)更严格的安全约束。其中一件被阻止的事情是访问GDI API的大部分表面区域,其中包括一些字体操作。正如其他人注意到的那样,如果相同的代码在普通的IaaS VM、云服务或甚至本地桌面/笔记本电脑上工作,那么您遇到的问题是底层GDI调用上的硬块。

如果您可以访问字体文件,并且可以将其部署到您的项目中,您可以加载该字体文件,详细信息请参见此处的PDFSharp文档。这将是确保字体可用的首选方法,无论您部署到什么环境。

你也可以在这篇文章中找到更多的信息。

最新更新