我正在尝试使用nuget包MVCRazorToPdf将自定义字体添加到我的pdf输出中,但是由于iTextSharp的文档不是很好,而且似乎都已过时,我在执行此操作时遇到了麻烦.
我用于创建pdf的当前代码是:
return new PdfActionResult(
"test.cshtml",
new TestModel(),
(writer, document) =>
{
FontFactory.Register(HostingEnvironment.MapPath("~/content/fonts/vegur-regular-webfont.ttf"), "VegurRegular");
});
其中writer是PdfWriter,而document是Document
使用FontFactory的所有示例都表明您需要使用XmlWorker,但是我无权使用它,因此我想知道是否有任何方法可以使用writer或document更改文档字体?
我已经看到有document.HtmlStyleClass属性,但是在任何地方都找不到有关如何使用它的任何信息.
任何帮助,将不胜感激
解决方法:
MVCRazorToPdf
是围绕iTextSharp的XMLWorker的非常非常简单的包装器,并使用甚至更简单的XMLWorkerHelper及其所有默认值来完成其工作.如果您查看source,将会看到以下内容:
document.Open();
using (var reader = new StringReader(RenderRazorView(context, viewName)))
{
XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, reader);
document.Close();
output = workStream.ToArray();
}
如果您对使用NuGet版本一无所知,那么您将被此实现所束缚,并且您将无法注册自定义字体.
但是,有一个与此有关的open issue和includes a fix,因此,如果您愿意针对compile from source,则可以应用该更改,并且您应该已经准备就绪.
如果您想更进一步,我建议您阅读this great post,该书显示了使用iTextSharp解析HTML的过程非常简单,而Bruno’s post here显示了如何注册字体的过程.
编辑
按照中的文章包括一个修复链接(以防万一该链接将来断开),请将上述using语句更改为:
using (var reader = new MemoryStream(Encoding.UTF8.GetBytes(RenderRazorView(context, viewName))))
{
XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, reader, null, FontFactory.FontImp as IFontProvider);
document.Close();
output = workStream.ToArray();
}
然后,在使用style =“ font-family:VegurRegular;”时,在上述问题中注册的字体工厂将起作用.