使用自定义字体的MVCRazorToPdf(iTextSharp)

我正在尝试使用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 issueincludes 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;”时,在上述问题中注册的字体工厂将起作用.

上一篇:「题解」kuangbin 最小生成树


下一篇:c# – MVC3将多个pdfs作为zip文件返回