2012-11-29 33 views
3

我想加载自定义字体(ttf文件)并用Graphics对象绘制到图像中。此代码运行在本地罚款:PrivateFontCollection在Appharbor上失败

PrivateFontCollection fonts = new PrivateFontCollection(); 

string path = context.Server.MapPath("~/App_Data/Futura LT Bold.ttf"); 

if (!System.IO.File.Exists(path)) 
{ 
    throw new InvalidOperationException("Font file is not deployed: " + path); 
} 

fonts.AddFontFile(path); 

然而,当上appharbor运行,调用AddFontFile失败,出现异常:

System.ArgumentException: Font 'Futura LT Book' does not support style 'Regular'. 
at System.Drawing.Font.CreateNativeFont() 
at System.Drawing.Font.Initialize(FontFamily family, Single emSize, FontStyle style, GraphicsUnit unit, Byte gdiCharSet, Boolean gdiVerticalFont) 
at System.Drawing.Font..ctor(FontFamily family, Single emSize) 
at LumenboxWeb.Controllers.GalleryController.FontTest() in d:\temp\h5oqslma.udd\input\src\LumenboxWeb\Controllers\GalleryController.cs:line 59 
at lambda_method(Closure , ControllerBase , Object[]) 
at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 

我已经尝试了不同的字体,以及他们所有的工作在当地,但没有工作在appharbor上。

是否可以在appharbor上动态加载字体?

+0

那么,有一个名为FontTest()的方法,测试失败。更改测试或避免该字体。 –

+0

FontTest不是单元测试。我只是使用该控制器操作来重现此问题。我需要在生产代码中执行此操作。 –

回答

3
string path = context.Server.MapPath("~/App_Data/Futura LT Bold.ttf"); 
fonts.AddFontFile(path); 

您可以从.ttf名称中知道为什么会抛出异常。请注意文件名称中的“粗体”。这使得您可以使用FontStyle = Regular创建该字体的实例的几率很低。但有很大的可能性,FontStyle = Bold会起作用。

一个字体通常有多个 .ttf文件,每个FontStyle对应一个字体。假设你有他们,你还必须添加其他文件。

+0

是的,这是问题,不知道为什么它在我的本地PC上工作,但不是appharbor。无论如何,这固定它。谢谢 –