C# iTextSharp pdf中缺少令人敬畏的字体图标

C# iTextSharp pdf中缺少令人敬畏的字体图标,c#,pdf,vue.js,itext,font-awesome,C#,Pdf,Vue.js,Itext,Font Awesome,我正在尝试使用iTextSharp获取HTML内容并将其转换为PDF。一切都很好,除了字体可怕的图标没有出现在结果的PDF中 我的.NET MVC应用程序是用C#编写的,并使用字体Awesome Free 5.0.12(使用方法)、iTextSharp 5.5.13以及iTextSharp.xmlworker和Vue.js框架 从浏览器中单击“打印”按钮时,将调用一个vue.js方法,该方法获取要转换的HTML内容(包含在隐藏的div中)并将其发布到相应的控制器方法(然后获取响应数据并加载):

我正在尝试使用iTextSharp获取HTML内容并将其转换为PDF。一切都很好,除了字体可怕的图标没有出现在结果的PDF中

我的.NET MVC应用程序是用C#编写的,并使用字体Awesome Free 5.0.12(使用方法)、iTextSharp 5.5.13以及iTextSharp.xmlworker和Vue.js框架

从浏览器中单击“打印”按钮时,将调用一个vue.js方法,该方法获取要转换的HTML内容(包含在隐藏的div中)并将其发布到相应的控制器方法(然后获取响应数据并加载):

PDFController中的导出方法如下所示:

[HttpPost]
[ValidateInput(false)]
public ActionResult Export(HtmlViewModel model)
{
    var generator = new PDFGenerator();
    return File(generator.Generate(model), "application/pdf", "Confirmation" + DateTime.Now + ".pdf");
}
PDFGenerator类中的Generate方法如下所示:

public byte[] Generate(HtmlViewModel html)
{
    HtmlNode.ElementsFlags["br"] = HtmlElementFlag.Closed;
    HtmlNode.ElementsFlags["input"] = HtmlElementFlag.Closed;
    HtmlNode.ElementsFlags["hr"] = HtmlElementFlag.Closed;
    HtmlNode.ElementsFlags["img"] = HtmlElementFlag.Closed;

    HtmlDocument doc = new HtmlDocument();
    doc.OptionFixNestedTags = true;
    doc.LoadHtml(html.HtmlData);
    html.HtmlData = doc.DocumentNode.OuterHtml;

    byte[] bytesArray = null;
    using (var ms = new MemoryStream())
    {
        using (var document = new Document(PageSize.A4, 40, 40, 40, 40))
        {
            using (PdfWriter writer = PdfWriter.GetInstance(document, ms))
            {
                document.Open();
                using (var strReader = new StringReader(html.HtmlData))
                {
                    //Set factories
                    HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
                    htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

                    //Set css
                    ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);

                    //Register a single font
                    cssResolver.AddCssFile(System.Web.HttpContext.Current.Server.MapPath("~/Content/bootstrap.css"), true);
                    cssResolver.AddCssFile(System.Web.HttpContext.Current.Server.MapPath("~/Content/app/print.css"), true);

                    //Export
                    IPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(document, writer)));
                    var worker = new XMLWorker(pipeline, true);
                    var xmlParse = new XMLParser(true, worker);
                    xmlParse.Parse(strReader);
                    xmlParse.Flush();
                }
                document.Close();
            }
        }
        bytesArray = ms.ToArray();
    }
    return bytesArray;
}
你知道如何让字体图标显示出来吗?例如,我在HTML代码中有类似的内容,经过转换后,它会消失在PDF中:

<i class="fas fa-1x fa-shopping-cart"></i> Print Order
打印顺序
我也尝试过使用unicode值,但也没有成功:

<i class="fas">&#xf07a;</i> Print Order
和#xf07a;打印订单

iText没有字体方面的知识,因此您需要做更多的工作。下面是一个简单的测试/工作示例

HTML:

输出:

几点注意:

  • 没有那么努力,但是使用了非常特殊的unicode字体。带有字体特定类的空Html节点对我不起作用
  • iText CSS解析器非常基本,因此请尽量保持简单,就像上面的HTML代码片段一样

iText处理器可能未在以下时间之前处理:。如果像下面的示例那样添加JS以在线插入图标,它们将起作用。隐藏在这个库中的JS是Javascript,它在打印前将字体A中的伪before元素复制到在线
<i class="fas">&#xf07a;</i> Print Order
<html>
<head>
<style>
.fas { font-family: FontAwesome; color:green; }
</style>
</head>
<body>
<i class='fas'>&#xf07a;</i> Print Order
</body></html>
using (var stream = new FileStream(OUTPUT_FILE, FileMode.Create))
{
    using (var document = new Document())
    {
        var writer = PdfWriter.GetInstance(document, stream);
        document.Open();

        var cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);
        // path to fontawesome.css
        cssResolver.AddCssFile(CSS_PATH, true);

        // question missing this part - REGISTER the font(s)
        var fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
        // may need to add other web-fonts-with-css\webfonts\*.ttf depending on needs 
        fontProvider.Register(Path.Combine(FONT_PATH, "fa-solid-900.ttf"), "FontAwesome");
        var cssAppliers = new CssAppliersImpl(fontProvider);

        var htmlPipelineContext = new HtmlPipelineContext(cssAppliers);
        htmlPipelineContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

        var pdfWriterPipeline = new PdfWriterPipeline(document, writer);
        var htmlPipeline = new HtmlPipeline(htmlPipelineContext, pdfWriterPipeline);
        var cssResolverPipeline = new CssResolverPipeline(
            cssResolver, htmlPipeline
        );

        var worker = new XMLWorker(cssResolverPipeline, true);
        var parser = new XMLParser(worker);
        using (var stringReader = new StringReader(XHTML))
        {
            parser.Parse(stringReader);
        }
    }
}