显示将Html转换为Pdf的Unicode字符

我正在使用itextsharp dll将HTML转换为PDF。

HTML有一些Unicode字符,如α,β…当我尝试将HTML转换为PDF时,Unicode字符不显示在PDF中。

我的function:

Document doc = new Document(PageSize.LETTER); using (FileStream fs = new FileStream(Path.Combine("Test.pdf"), FileMode.Create, FileAccess.Write, FileShare.Read)) { PdfWriter.GetInstance(doc, fs); doc.Open(); doc.NewPage(); string arialuniTff = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ARIALUNI.TTF"); BaseFont bf = BaseFont.CreateFont(arialuniTff, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); Font fontNormal = new Font(bf, 12, Font.NORMAL); List<IElement> list = HTMLWorker.ParseToList(new StringReader(stringBuilder.ToString()), new StyleSheet()); Paragraph p = new Paragraph {Font = fontNormal}; foreach (var element in list) { p.Add(element); doc.Add(p); } doc.Close(); } 

在处理Unicode字符和iTextSharp时,有几件事需要注意。 你已经做了第一个,这是一个支持你的字符的字体。 第二件事是你想实际注册iTextSharp的字体,以便它知道它。

 //Path to our font string arialuniTff = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ARIALUNI.TTF"); //Register the font with iTextSharp iTextSharp.text.FontFactory.Register(arialuniTff); 

现在我们有了一个字体,我们需要创build一个StyleSheet对象来告诉iTextSharp何时以及如何使用它。

 //Create a new stylesheet iTextSharp.text.html.simpleparser.StyleSheet ST = new iTextSharp.text.html.simpleparser.StyleSheet(); //Set the default body font to our registered font's internal name ST.LoadTagStyle(HtmlTags.BODY, HtmlTags.FACE, "Arial Unicode MS"); 

您还需要做的一个非HTML部分是设置一个特殊的encoding参数。 这种编码特定于iTextSharp,在你的情况下,你希望它是Identity-H 如果你不设置这个,那么它默认为Cp1252WINANSI )。

 //Set the default encoding to support Unicode characters ST.LoadTagStyle(HtmlTags.BODY, HtmlTags.ENCODING, BaseFont.IDENTITY_H); 

最后,我们需要将我们的样式表传递给ParseToList方法:

 //Parse our HTML using the stylesheet created above List<IElement> list = HTMLWorker.ParseToList(new StringReader(stringBuilder.ToString()), ST); 

把这一切放在一起,从开放到结束,你会有:

 doc.Open(); //Sample HTML StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(@"<p>This is a test: <strong>α,β</strong></p>"); //Path to our font string arialuniTff = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ARIALUNI.TTF"); //Register the font with iTextSharp iTextSharp.text.FontFactory.Register(arialuniTff); //Create a new stylesheet iTextSharp.text.html.simpleparser.StyleSheet ST = new iTextSharp.text.html.simpleparser.StyleSheet(); //Set the default body font to our registered font's internal name ST.LoadTagStyle(HtmlTags.BODY, HtmlTags.FACE, "Arial Unicode MS"); //Set the default encoding to support Unicode characters ST.LoadTagStyle(HtmlTags.BODY, HtmlTags.ENCODING, BaseFont.IDENTITY_H); //Parse our HTML using the stylesheet created above List<IElement> list = HTMLWorker.ParseToList(new StringReader(stringBuilder.ToString()), ST); //Loop through each element, don't bother wrapping in P tags foreach (var element in list) { doc.Add(element); } doc.Close(); 

编辑

在您的评论中,您将显示指定覆盖字体的HTML。 iTextSharp不会蜘蛛系统的字体和它的HTMLparsing器不使用字体回退技术。 HTML / CSS中指定的任何字体都必须手动注册。

 string lucidaTff = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "l_10646.ttf"); iTextSharp.text.FontFactory.Register(lucidaTff); 

您也可以使用新的XMLWorkerHelper (来自库itextsharp.xmlworker ),但是您需要重写默认的FontFactory实现。

 void GeneratePdfFromHtml() { const string outputFilename = @".\Files\report.pdf"; const string inputFilename = @".\Files\report.html"; using (var input = new FileStream(inputFilename, FileMode.Open)) using (var output = new FileStream(outputFilename, FileMode.Create)) { CreatePdf(input, output); } } void CreatePdf(Stream htmlInput, Stream pdfOutput) { using (var document = new Document(PageSize.A4, 30, 30, 30, 30)) { var writer = PdfWriter.GetInstance(document, pdfOutput); var worker = XMLWorkerHelper.GetInstance(); document.Open(); worker.ParseXHtml(writer, document, htmlInput, null, Encoding.UTF8, new UnicodeFontFactory()); document.Close(); } } public class UnicodeFontFactory : FontFactoryImp { private static readonly string FontPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "arialuni.ttf"); private readonly BaseFont _baseFont; public UnicodeFontFactory() { _baseFont = BaseFont.CreateFont(FontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); } public override Font GetFont(string fontname, string encoding, bool embedded, float size, int style, BaseColor color, bool cached) { return new Font(_baseFont, size, style, color); } } 

以下是将Html转换为Pdf时显示unicode字符的几个步骤

  1. 创build一个HTMLWorker
  2. 注册一个Unicode字体并分配它
  3. 创build一个样式表并将编码设置为Identity-H
  4. 将样式表分配给htmlparsing器

检查下面的链接更多的理解….

  • 显示将Html转换为Pdf的Unicode字符

在使用此方法从HTML转换为PDF时,也会显示印地语,土耳其语和特殊字符。 检查下面的演示图像。

在这里输入图像描述