使用PdfSharp加载字体.Xamarin.Forms的标准预览失败:找不到合适的字体

时间:2018-02-08 06:49:45

标签: android xamarin.forms pdfsharp

我目前正在评估如何从Xamarin.Forms生成PDF(目前仅在Android上运行该应用)并检查.NET Standard port of PdfSharp

绘制PDF并显示它有效,但我在向文档中写入文本时遇到问题。当我尝试使用以下代码

加载XFont
var font = new XFont("sans-serif", 20);

它以异常

失败
  

System.InvalidOperationException:找不到合适的字体。

根据these样本,它应该以这种方式工作,但它们适用于PdfSharp.Xamarin,而不适用于PdfSharp .NET标准。根据{{​​3}},"sans-serif"字体系列应该是正确的,但我已经拼命尝试其他选项,例如"Roboto",但无济于事。

用于.NET Standard的PdfSharp是否与Xamarin完全兼容? (它列出了PdfSharp.Xamarin作为它创建的来源,因此我认为它。)还有什么我错过了吗?

修改

我尝试了PdfSharp.Xamarin并且确实有效。显然这是.NET标准端口的一个问题。

1 个答案:

答案 0 :(得分:0)

我有类似的问题,我通过编写自己的IFontResolver实现并将其分配给GlobalFontSettings.FontResolver来解决它。

public class FileFontResolver : IFontResolver // FontResolverBase
{
    public string DefaultFontName => throw new NotImplementedException();

    public byte[] GetFont(string faceName)
    {
        using (var ms = new MemoryStream())
        {
            using (var fs = File.Open(faceName, FileMode.Open))
            {
                fs.CopyTo(ms);
                ms.Position = 0;
                return ms.ToArray();
            }
        }
    }

    public FontResolverInfo ResolveTypeface(string familyName, bool isBold, bool isItalic)
    {
        if (familyName.Equals("Verdana", StringComparison.CurrentCultureIgnoreCase))
        {
            if (isBold && isItalic)
            {
                return new FontResolverInfo("Fonts/Verdana-BoldItalic.ttf");
            }
            else if (isBold)
            {
                return new FontResolverInfo("Fonts/Verdana-Bold.ttf");
            }
            else if (isItalic)
            {
                return new FontResolverInfo("Fonts/Verdana-Italic.ttf");
            }
            else
            {
                return new FontResolverInfo("Fonts/Verdana-Regular.ttf");
            }
        }
        return null;
    }
}

然后告诉PDFSharp使用它:

GlobalFontSettings.FontResolver = new FileFontResolver();