使用MigraDoc在Xamarin Forms上创建PDF时找不到合适的字体



我正在尝试使用MigraDoc创建一个pdf。以下是我正在使用的库列表:

  • MigraDoc.DocumentObjectModel
  • MigraDoc.DocumentObjectModel.Tables
  • MigraDoc.渲染

它使我在printer.RenderDocument()上出现错误。下方的代码

private async Task SavePDF()
{
filePath = emulatorFolderPath + "/Signed/" + _reportInformationViewModel.SelectedClient.Username + "-" + DateTime.Now.ToString("dd_MM_yyyy HH-mm") + ".pdf";
MigraDocRendering.PdfDocumentRenderer printer = new MigraDocRendering.PdfDocumentRenderer
{
Document = document
};
printer.RenderDocument();
printer.PdfDocument.Save(filePath);
}

附言:我不需要使用私人字体。

我已经通过实现IFontResolver解决了问题我添加了一个包含Open Sans字体的文件夹Fonts。我创建了一个文件夹Helpers,其中包含一个名为GenericFontResolver:的类

public class GenericFontResolver : IFontResolver
{
public string DefaultFontName => "OpenSans";
public byte[] GetFont(string faceName)
{
if (faceName.Contains(DefaultFontName))
{
var assembly = typeof(ReportPreviewAndSignatureViewModel).GetTypeInfo().Assembly;
var stream = assembly.GetManifestResourceStream($"PDFDemo.Fonts.{faceName}.ttf");
using (var reader = new StreamReader(stream))
{
var bytes = default(byte[]);
using (var ms = new MemoryStream())
{
reader.BaseStream.CopyTo(ms);
bytes = ms.ToArray();
}
return bytes;
}
}
else
return GetFont(DefaultFontName);
}
public FontResolverInfo ResolveTypeface(string familyName, bool isBold, bool isItalic)
{
var fontName = string.Empty;
switch (familyName)
{
case "Open Sans":
case "OpenSans":
fontName = "OpenSans";
if (isBold && isItalic)
fontName = $"{fontName}-BoldItalic";
else if (isBold)
fontName = $"{fontName}-Bold";
else if (isItalic)
fontName = $"{fontName}-Italic";
else
fontName = $"{fontName}-Regular";
return new FontResolverInfo(fontName);
default:
break;
}
return null;
}
}

然后,在需要我添加的字体的类的构造函数上:

GlobalFontSettings.FontResolver = new GenericFontResolver();

然后,当我创建表时,您必须添加:

Style style = document.Styles["Normal"];
style.Font.Name = "OpenSans";

最新更新