Fonts azure 1.50的PDFSharp专用字体

Fonts azure 1.50的PDFSharp专用字体,fonts,private,pdfsharp,Fonts,Private,Pdfsharp,我已经下载并安装了PDFSharp 1.5,使用私人字体时遇到问题。我已经在测试中创建了一个pdf创建者,它工作得很好。当我把它加载到Azure时,它会给我一个错误:无法加载字体。做了调查,发现他们没有任何加载的字体,所以我必须使用私人字体。我只能找到旧的1.3版本的示例,并且这些方法已更改为新的。有人能给我举一个使用新版本PDFSharp的简单例子吗 感谢John在使用PDFsharp 1.50的WPF版本时,您可以在自己的类中实现IFONTESOLVER,并将该类的实例分配给GlobalFo

我已经下载并安装了PDFSharp 1.5,使用私人字体时遇到问题。我已经在测试中创建了一个pdf创建者,它工作得很好。当我把它加载到Azure时,它会给我一个错误:无法加载字体。做了调查,发现他们没有任何加载的字体,所以我必须使用私人字体。我只能找到旧的1.3版本的示例,并且这些方法已更改为新的。有人能给我举一个使用新版本PDFSharp的简单例子吗


感谢John

在使用PDFsharp 1.50的WPF版本时,您可以在自己的类中实现
IFONTESOLVER
,并将该类的实例分配给
GlobalFontSettings.FontResolver

PDFsharp 1.50仍在建设中。当它是最终的,它应该包括FontResolver样本

示例代码可在PDFsharp论坛上找到:

注意:XPrivateFontCollection应该与GDI和WPF构建一起使用。如果您使用文档预览并希望在那里看到您的字体,则必须使用XPrivateFontCollection。

对于没有用户界面的进程(例如,在web服务器上生成PDF),IFontResolver可能是最佳选择,但它不适用于GDI构建。

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

将您想要的字体添加到项目中-在下面的示例中,我将
Arial
放在
MyProject\font\Arial\Arial.ttf
等中。将每个字体文件设置为嵌入式资源(属性->构建操作)

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

MyFontResolver.Apply(); // Ensures it's only applied once
下面是字体解析程序类:

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;
        }
    }
}
MyFontResolver类:IFontResolver { public FontResolverInfo ResolveTypeface(字符串familyName、bool-isBold、bool-istalic) { //忽略字体名称的大小写。 var name=familyName.ToLower().TrimEnd('#'); //处理我们知道的字体。 交换机(名称) { “arial”一案: 如果(以粗体显示) { 如果(伊斯兰语) 返回新的FontResolverInfo(“Arial#bi”); 返回新的FontResolverInfo(“Arial#b”); } 如果(伊斯兰语) 返回新的FontResolverInfo(“Arial#i”); 返回新的FontResolverInfo(“Arial#”); } //我们将所有其他字体请求传递给默认处理程序。 //在没有足够权限的情况下在web服务器上运行时,可以在此阶段返回默认字体。 返回平台FontResolver.ResolveTypeface(familyName、isBold、isItalic); } 公共字节[]GetFont(字符串faceName) { 开关(faceName) { “Arial#”格: 返回LoadFontData(“MyProject.fonts.arial.arial.ttf”);; 判例“Arial#b”: 返回LoadFontData(“MyProject.fonts.arial.arialbd.ttf”);; 判例“Arial#i”: 返回LoadFontData(“MyProject.fonts.arial.ariali.ttf”); 案例“Arial#bi”: 返回LoadFontData(“MyProject.fonts.arial.arialbi.ttf”); } 返回null; } /// ///从嵌入式资源返回指定的字体。 /// 专用字节[]LoadFontData(字符串名称) { var assembly=assembly.getExecutionGassembly(); //测试代码以查找嵌入字体的名称-关注“ourResources” //var ourResources=assembly.GetManifestResourceNames(); 使用(Stream=assembly.GetManifestResourceStream(名称)) { if(流==null) 抛出新ArgumentException(“没有名为“+name”的资源); int count=(int)stream.Length; 字节[]数据=新字节[计数]; 读取(数据,0,计数); 返回数据; } } 内部静态MyFontResolver OurGlobalFontResolver=null; /// ///确保字体解析程序仅应用一次(或引发异常) /// 内部静态无效应用() { 如果(我们的GlobalFontResolver==null | | GlobalFontSettings.FontResolver==null) { if(ourglobalfonthesolver==null) OurGlobalFontResolver=新的MyFontResolver(); GlobalFontSettings.FontResolver=我们的GlobalFontResolver; } } }
1.50版的更新示例尚未发布-应在1月份发布。1.50版目前处于测试阶段。您仍然可以获得PDFsharp版本1.32(源代码和NuGet软件包)。我已经下载了版本1.32和版本1.3,我仍然感到困惑。我的困惑是,我在所有示例中都看到他们使用xprivateFontCollection pfc=new xprivateFontCollection();pfc.Add(XXXXXX);我得到了pfc.AddFont(XXX)他们使用什么版本来得到pfc.Add,这样我就可以使用示例了?好的,我找到了为什么我没有看到.Add,因为我使用的是GDI而不是WPF。仍然不起作用,但我至少更接近了。PDFsharp包含一个使用私有字体的工作示例。你没有显示任何代码,因此我们无法帮助你。这基本上是其他答案中链接的论坛帖子中的代码(没有任何学分)。你救了我一天。