我正在尝试使用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";