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



我当前正在评估如何从xamarin.forms生成PDF(当前仅在Android上运行该应用程序(,并检查PDFSHARP的.NET标准端口。

绘制到PDF并显示其有效,但是我遇到了编写文档的问题。当我尝试加载XFont时,使用以下代码

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

它失败了,异常

system.invalidoperationException:找不到合适的字体。

根据这些样品,它应该以这种方式工作,但它们适用于pdfsharp.xamarin,而不是pdfsharp .NET标准。根据此答案,"sans-serif"字体家族应该是正确的,但是我拼命尝试了其他选项,例如"Roboto",但无济于事。

PDFSHARP是否完全适用于.NET标准与Xamarin兼容?(它列出了pdfsharp.xamarin作为它创建的来源,因此我假设了。(我还有其他我错过的吗?

编辑

我尝试了pdfsharp.xamarin,它确实有效。显然,这是.NET标准端口的问题。

我也有类似的问题,我通过编写自己的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();

如果您拒绝上述代码的访问。请用

替换代码
public byte[] GetFont(string faceName)
    {
        using (var ms = new MemoryStream())
        {
            using (var fs = File.OpenRead(faceName))
            {
                fs.CopyTo(ms);
                ms.Position = 0;
                return ms.ToArray();
            }
        }
    }

最新更新