创建新XFont时发生异常。 PDFSharp Xamarin

问题描述 投票:0回答:1

[调试我的应用程序时,创建XFont对象时出现异常。知道有什么问题吗?在我在github等上找到的所有示例中,它与下面的代码完全一样。

System.TypeInitializationException:' 'PdfSharpCore.Utils.FontResolver'引发了异常。'

document.Info.Title = "created with pdfsharp";

// Create an empty page
PdfPage page = document.AddPage();

// Get an XGraphics object for drawing
XGraphics gfx = XGraphics.FromPdfPage(page);

// Create a font
XFont font = new XFont("Verdana", 20, XFontStyle.BoldItalic);

// Draw the text
gfx.DrawString("Test of PdfSharp on Android", font, 
                new XSolidBrush(XColor.FromArgb(0, 0, 0)), 
                10, 130);
// Save the document...
document.Save(Path.Combine(Path.GetTempPath(), Name));
c# android xamarin.forms pdfsharp
1个回答
0
投票

根据您的代码,我想您使用的是PdfSharp.Xamarin.Forms库,现在您想为pdf使用自定义字体,对吗?

如果是,请看下面的代码,实现IFontResolver。

internal class FontProvider : IFontResolver
{
    #region Properties
    public string DefaultFontName
    {
        get { return "OpenSans"; }
    }
    #endregion

    #region Fields
    public ICustomFontProvider _fontProvider;
    public static readonly string[] DefaultFontFiles = new string[]
        {
            "OpenSans-Regular.ttf",
            "OpenSans-Bold.ttf",
            "OpenSans-Italic.ttf",
            "OpenSans-BoldItalic.ttf",
        };
    #endregion

    #region Ctor
    public FontProvider(ICustomFontProvider fontProvider)
    {
        _fontProvider = fontProvider;
    }
    #endregion

    #region IFontResolver implementation
    public byte[] GetFont(string faceName)
    {
        if (DefaultFontFiles.Contains(faceName) || _fontProvider == null)
        {
            var assembly = typeof(FontProvider).GetTypeInfo().Assembly;
            Stream stream = assembly.GetManifestResourceStream($"PdfSharp.Xamarin.Forms.DefaultFonts.{faceName}");
            using (var reader = new StreamReader(stream))
            {
                var bytes = default(byte[]);
                using (var memstream = new MemoryStream())
                {
                    reader.BaseStream.CopyTo(memstream);
                    bytes = memstream.ToArray();
                }
                return bytes;
            }
        }
        else
        {
            return _fontProvider.GetFont(faceName);
        }
    }

    public FontResolverInfo ResolveTypeface(string familyName, bool isBold, bool isItalic)
    {
        string fontName;
        if (familyName == DefaultFontName || _fontProvider == null)
            fontName = DefaultFontFiles[Convert.ToInt32(isBold) + 2 * Convert.ToInt32(isItalic)];
        else
            fontName = _fontProvider.ProvideFont(familyName, isBold, isItalic);

        return new FontResolverInfo(fontName);
    }
    #endregion
}

您还可以编写我自己的IFontResolver实现并将其分配给GlobalFontSettings.FontResolver。

请查看以下线程:

Loading a Font with PdfSharp .Net Standard preview from Xamarin.Forms fails: No appropriate font found

© www.soinside.com 2019 - 2024. All rights reserved.