Mostra caratteri Unicode nella conversione da Html a Pdf

Sto usando itextsharp dll per convertire HTML in PDF.

L’HTML ha alcuni caratteri Unicode come α, β … quando provo a convertire l’HTML in PDF, i caratteri Unicode non sono mostrati in PDF.

La mia funzione:

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 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(); } 

Quando si ha a che fare con caratteri Unicode e iTextSharp ci sono un paio di cose di cui bisogna aver cura. Il primo che hai già fatto e sta ricevendo un font che supporta i tuoi personaggi. La seconda cosa è che vuoi effettivamente registrare il font con iTextSharp in modo che ne sia a conoscenza.

 //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); 

Ora che abbiamo un font abbiamo bisogno di creare un object StyleSheet che dice a iTextSharp quando e come usarlo.

 //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"); 

L’unica parte non HTML che devi anche impostare è un parametro speciale di encoding . Questa codifica è specifica per iTextSharp e nel tuo caso vuoi che sia Identity-H . Se non lo imposti, il valore predefinito è Cp1252 ( WINANSI ).

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

Infine, dobbiamo passare il nostro foglio di stile al metodo ParseToList :

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

Mettendo tutto insieme, da aperto a vicino avresti:

 doc.Open(); //Sample HTML StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(@"

This is a test: α,β

"); //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 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();

MODIFICARE

Nel tuo commento mostra HTML che specifica un font di sostituzione. iTextSharp non spider il sistema per i font e il suo parser HTML non usa tecniche di fallback dei font. Tutti i font specificati in HTML / CSS devono essere registrati manualmente.

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

È anche ansible utilizzare il nuovo XMLWorkerHelper (dalla libreria itextsharp.xmlworker ), è comunque necessario sovrascrivere l’implementazione predefinita di 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); } } 
 private class UnicodeFontFactory : FontFactoryImp { private BaseFont _baseFont; public UnicodeFontFactory() { string FontPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "arialuni.ttf"); _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); } } 

// e codice

 FontFactory.FontImp = new UnicodeFontFactory(); string convertedHtml = string.Empty; foreach (char c in htmlText) { if (c < 127) convertedHtml += c; else convertedHtml += "&#" + (int)c + ";"; } List htmlElements = XMLWorkerHelper.ParseToElementList(convertedHtml, null); // add the IElements to the document foreach (IElement htmlElement in htmlElements) { document.Add(htmlElement); } 

Ecco i pochi passaggi per visualizzare i caratteri Unicode nella conversione da Html a Pdf

  1. Crea un HTMLWorker
  2. Registra un font Unicode e assegnalo
  3. Crea un foglio di stile e imposta la codifica su Identity-H
  4. Assegna il foglio di stile al parser html

Controlla sotto il collegamento per maggiore comprensione ….

  • Mostra caratteri Unicode nella conversione da Html a Pdf

Caratteri hindi, turchi e speciali vengono visualizzati anche durante la conversione da HTML a PDF utilizzando questo metodo. Controlla qui sotto l’immagine demo.

inserisci la descrizione dell'immagine qui