C# iTextSharp pdf中缺少令人敬畏的字体图标
我正在尝试使用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中的导出方法如下所示: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中)并将其发布到相应的控制器方法(然后获取响应数据并加载):
[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"></i> Print Order
和#xf07a;打印订单
iText没有字体方面的知识,因此您需要做更多的工作。下面是一个简单的测试/工作示例
HTML:
输出:
几点注意:
- 没有那么努力,但是使用了非常特殊的unicode字体。带有字体特定类的空Html节点对我不起作用
- iText CSS解析器非常基本,因此请尽量保持简单,就像上面的HTML代码片段一样
<i class="fas"></i> Print Order
<html>
<head>
<style>
.fas { font-family: FontAwesome; color:green; }
</style>
</head>
<body>
<i class='fas'></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);
}
}
}