所以我需要使用我项目中包含的font.otf文件将.otf字体文件添加到c#中的PrivateFontCollection。当文件在本地加载时,我在部署到服务器时收到以下异常。
[例外:无法在路径中找到字体:D:\ Inetpub \ MyApplication \ Content \ Fonts \ ProximaNovaAlt-Black.otf例外是:System.IO.FileNotFoundException:找不到文件。 在System.Drawing.Text.PrivateFontCollection.AddFontFile(String filename)
但是,当我查看Web服务器并导航到该确切目录时,该文件就在那里,并且不是只读的。
字体文件是我项目中的位置,如下所示 /Content/Fonts/ProximaNovaAlt-Black.otf
此外,ProximaNovaAlt-Black.otf文件的属性如下
最后,这是抛出错误的代码
public Font GetFont(float fontSize)
{
string path = HttpContext.Current.Server.MapPath(AppDomain.CurrentDomain.BaseDirectory + @"Content\Fonts\ProximaNovaAlt-Black.otf");
try
{
PrivateFontCollection privateFontCollection = new PrivateFontCollection();
privateFontCollection.AddFontFile(path);
return new Font(privateFontCollection.Families[0], fontSize);
}
catch (Exception ex)
{
throw new Exception("Could not find font at path: " + path + " The exception is: " + ex.ToString());
}
}
答案 0 :(得分:12)
如果字体文件是不受支持的类型(http://msdn.microsoft.com/en-us/library/system.drawing.text.privatefontcollection.addfontfile.aspx),则FileNotFoundException也是抛出的异常。 TrueType字体有很好的支持,但对OpenType的支持有限。根据我的经验,这似乎因平台而异。
我使用http://everythingfonts.com/otf-to-ttf将我的OpenType字体转换为TrueType,这解决了问题。
答案 1 :(得分:1)
试试这个: 像资源一样添加字体,然后
PrivateFontCollection privateFontCollection = new PrivateFontCollection();
var memory = IntPtr.Zero;
try
{
memory = Marshal.AllocCoTaskMem(value.Length);
Marshal.Copy(value, 0, memory, value.Length);
privateFontCollection .AddMemoryFont(memory, value.Length);
}
finally
{
Marshal.FreeCoTaskMem(memory);
}
return new Font(privateFontCollection.Families[0], fontSize);
这对我来说很好。
答案 2 :(得分:0)
Windows是否加密了服务器计算机上的字体文件夹?我曾经发生过一次。这很奇怪。 Windows决定加密文件夹以进行测试。
如果文件夹已加密,则Windows资源管理器中的文件夹名称应为绿色而不是黑色。