3

我正在尝试使用 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是一个PdfWriterdocument是一个Document

所有使用显示的示例FontFactory都需要使用,XmlWorker但我无权访问,所以我想知道是否有任何方法可以使用writeror更改文档字体document

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

对此的任何帮助将不胜感激

4

1 回答 1

4

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 是多么简单,以及Bruno 的文章在这里展示了如何注册字体。

编辑

根据包含修复链接中的帖子(以防将来链接断开),将上述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;"

于 2015-12-10T14:18:10.833 回答