【问题标题】:Exception when creating new XFont. PDFSharp Xamarin创建新 XFont 时出现异常。 PDFSharp Xamarin
【发布时间】:2020-05-10 13:46:12
【问题描述】:

当我调试我的应用程序时,在创建 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));

【问题讨论】:

  • 你能解决这个问题吗?我在 Android 上遇到了同样的问题,但在 UWP 上没有问题。

标签: c# android xamarin.forms pdfsharp


【解决方案1】:

根据您的代码,我猜您使用的是 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

【讨论】:

  • 这是什么?我只想创建一个字体。我在控制台应用程序中直接使用 C#/.NET。没有 Xamarin 或其他类似的东西。为什么他们的“Hello World”需要这么复杂?
猜你喜欢
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 2019-09-25
相关资源
最近更新 更多