我正在尝试使用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
属性但无法找到任何关于如何在任何地方使用它的内容。
非常感谢任何帮助
答案 0 :(得分:4)
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;"