PDFSharp专用字体为azure 1.50 [英] PDFSharp private fonts for azure 1.50

查看:283
本文介绍了PDFSharp专用字体为azure 1.50的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经下载并安装了PDFSharp 1.5,并且在使用专用字体时遇到了麻烦。我创建了一个PDF格式的创作者,效果很好。当我将它加载到Azure中时,它会给我提供无法加载字体的错误。研究发现,他们没有任何加载的字体,所以我必须使用私人字体。我只能找到较旧的1.3版本的例子,方法更改为新的。有人可以给我看一个简单的例子,使用新版本的PDFSharp吗?



谢谢John

解决方案

这是用于PdfSharp 1.5 beta3b的。这里是一个完整的和固定的例子,基于来自其他答案的链接和其他问题,但是对于Arial。

将你想要的字体添加到你的项目中 - 在我的例子中我把 Arial 放在 MyProject \fonts \arial\arial.ttf 等等中。将每个字体文件设置为嵌入式资源(属性 - >构建动作)。



使用静态调用应用字体解析器,如下所示:

  MyFontResolver.Apply(); //确保它只应用一次

这里是字体解析器类:

  class MyFontResolver:IFontResolver 
{
public FontResolverInfo ResolveTypeface(string familyName,bool isBold,bool isItalic)
{
//忽略字体名称的大小写。
var name = familyName.ToLower()。TrimEnd('#');

//处理我们知道的字体。
switch(name)
{
casearial:
if(isBold)
{
if(isItalic)
返回新的FontResolverInfo ( Arial字体#BI);
返回新的FontResolverInfo(Arial#b);

if(isItalic)
return new FontResolverInfo(Arial#i);
返回新的FontResolverInfo(Arial#);
}

//我们将所有其他字体请求传递给默认处理程序。
//在没有足够权限的Web服务器上运行时,可以在此阶段返回默认字体。
返回PlatformFontResolver.ResolveTypeface(familyName,isBold,isItalic);

$ b public byte [] GetFont(string faceName)
{
switch(faceName)
{
caseArial#:
返回LoadFontData(MyProject.fonts.arial.arial.ttf);;

caseArial#b:
return LoadFontData(MyProject.fonts.arial.arialbd.ttf);;

caseArial#i:
return LoadFontData(MyProject.fonts.arial.ariali.ttf);

caseArial#bi:
return LoadFontData(MyProject.fonts.arial.arialbi.ttf);
}

返回null;
}

///< summary>
///从嵌入资源中返回指定的字体。
///< / summary>
private byte [] LoadFontData(string name)
{
var assembly = Assembly.GetExecutingAssembly();

//测试代码以查找嵌入式字体的名称 - 在ourResources
上放置一个监视器// var ourResources = assembly.GetManifestResourceNames();

使用(Stream stream = assembly.GetManifestResourceStream(name))
{
if(stream == null)
throw new ArgumentException(No resource with name + name);

int count =(int)stream.Length;
byte [] data = new byte [count];
stream.Read(data,0,count);
返回数据;
}
}

内部静态MyFontResolver OurGlobalFontResolver = null;

///< summary>
///确保字体解析器只应用一次(或引发异常)
///< / summary>
内部静态无效应用()
{
if(OurGlobalFontResolver == null || GlobalFontSettings.FontResolver == null)
{
if(OurGlobalFontResolver == null)
OurGlobalFontResolver = new MyFontResolver();

GlobalFontSettings.FontResolver = OurGlobalFontResolver;
}
}
}


I have downloaded and installed PDFSharp 1.5 and I am having trouble using private fonts. I have created in testing a pdf creator and it works great. When I load it into Azure it gives me the error can't load font. Did research and found out that they do not have any loaded fonts so I must use private font. I can only find examples of the older 1.3 version and the methods are changed to new ones. Can somebody show me a simple example using the new version of PDFSharp?

Thanks John

解决方案

This is for PdfSharp 1.5 beta3b. Here is a complete and fixed example based on links from other answers, and other questions - but for Arial.

Add the fonts you want to your project - in my example below I put Arial in MyProject\fonts\arial\arial.ttf etc. Set each font file as an embedded resource (properties -> build action).

Apply the font resolver using the static call like this:

MyFontResolver.Apply(); // Ensures it's only applied once

Here's the font resolver class:

class MyFontResolver : IFontResolver
{
    public FontResolverInfo ResolveTypeface(string familyName, bool isBold, bool isItalic)
    {
        // Ignore case of font names.
        var name = familyName.ToLower().TrimEnd('#');

        // Deal with the fonts we know.
        switch (name)
        {
            case "arial":
                if (isBold)
                {
                    if (isItalic)
                        return new FontResolverInfo("Arial#bi");
                    return new FontResolverInfo("Arial#b");
                }
                if (isItalic)
                    return new FontResolverInfo("Arial#i");
                return new FontResolverInfo("Arial#");
        }

        // We pass all other font requests to the default handler.
        // When running on a web server without sufficient permission, you can return a default font at this stage.
        return PlatformFontResolver.ResolveTypeface(familyName, isBold, isItalic);
    }

    public byte[] GetFont(string faceName)
    {
        switch (faceName)
        {
            case "Arial#":
                return LoadFontData("MyProject.fonts.arial.arial.ttf");;

            case "Arial#b":
                return LoadFontData("MyProject.fonts.arial.arialbd.ttf");;

            case "Arial#i":
                return LoadFontData("MyProject.fonts.arial.ariali.ttf");

            case "Arial#bi":
                return LoadFontData("MyProject.fonts.arial.arialbi.ttf");
        }

        return null;
    }

    /// <summary>
    /// Returns the specified font from an embedded resource.
    /// </summary>
    private byte[] LoadFontData(string name)
    {
        var assembly = Assembly.GetExecutingAssembly();

        // Test code to find the names of embedded fonts - put a watch on "ourResources"
        //var ourResources = assembly.GetManifestResourceNames();

        using (Stream stream = assembly.GetManifestResourceStream(name))
        {
            if (stream == null)
                throw new ArgumentException("No resource with name " + name);

            int count = (int)stream.Length;
            byte[] data = new byte[count];
            stream.Read(data, 0, count);
            return data;
        }
    }

    internal static MyFontResolver OurGlobalFontResolver = null;

    /// <summary>
    /// Ensure the font resolver is only applied once (or an exception is thrown)
    /// </summary>
    internal static void Apply()
    {
        if (OurGlobalFontResolver == null || GlobalFontSettings.FontResolver == null)
        {
            if (OurGlobalFontResolver == null)
                OurGlobalFontResolver = new MyFontResolver();

            GlobalFontSettings.FontResolver = OurGlobalFontResolver;
        }
    }
}

这篇关于PDFSharp专用字体为azure 1.50的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆