MVCRazorToPdf(iTextSharp)使用自定义字体

时间:2015-12-10 11:11:25

标签: c# itextsharp mvcrazortopdf

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

其中writerPdfWriterdocumentDocument

使用FontFactory的所有示例都显示您需要使用XmlWorker,但我无法访问该内容,所以我想知道是否有任何方法可以更改使用writerdocument

记录字体

我已经看到有document.HtmlStyleClass属性但无法找到任何关于如何在任何地方使用它的内容。

非常感谢任何帮助

1 个答案:

答案 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;"

时,上述问题中注册的字体工厂将起作用