MVCRazorToPdf(iTextSharp)使用自定义字体

本文关键字:自定义 字体 iTextSharp MVCRazorToPdf | 更新日期: 2023-09-27 18:26:16

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

其中writerPdfWriter并且documentDocument

所有使用FontFactory的示例都表明您需要使用XmlWorker,但我无法访问,所以我想知道是否有任何方法可以使用writerdocument更改文档字体?

我已经看到有document.HtmlStyleClass属性,但找不到任何关于如何在任何地方使用它的信息。

如有任何帮助,将不胜感激

MVCRazorToPdf(iTextSharp)使用自定义字体

MVCRazorToPdf是iTextSharp的XMLWorker的一个非常非常简单的包装器,它使用更简单的XMLWorkerHelper(所有默认值)来完成它的工作。如果你看看来源,你会看到这个:

                document.Open();

                using (var reader = new StringReader(RenderRazorView(context, viewName)))
                {
                    XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, reader);
                    document.Close();
                    output = workStream.ToArray();
                }

如果你一意孤行地使用NuGet版本,那么你就只能使用这个实现,并且无法注册自定义字体。

然而,这方面有一个悬而未决的问题,其中包括一个修复程序,因此如果您愿意从源代码进行编译,您可以应用该更改,并且您应该做好准备。

如果你想更进一步,我建议你阅读这篇很棒的文章,它展示了用iTextSharp解析HTML是多么简单,布鲁诺在这里的文章也展示了如何注册字体。

编辑

根据中的帖子,包括一个修复链接(以防链接将来断开),将上述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;" 时,上面问题中注册的字体工厂将工作