Convierta contenido árabe “unicode” html o xml a pdf usando itextsharp

Intento crear informes en mi aplicación asp.net MVC3 después de mucha búsqueda. Encontré muchas publicaciones en el blog sobre ITextSharp para convertir mi Html/Razor a Pdf . Estoy tratando de analizar la vista de la máquina de afeitar para obtener PDf de la siguiente manera.

  public void Render(ViewContext viewContext, TextWriter writer) { var doc = new Document(); // associate output with response stream var pdfWriter = PdfWriter.GetInstance(doc, viewContext.HttpContext.Response.OutputStream); pdfWriter.CloseStream = false; viewContext.HttpContext.Response.ContentType = "application/pdf"; viewContext.HttpContext.Response.ContentEncoding = System.Text.Encoding.UTF8; // generate view into string var sb = new System.Text.StringBuilder(); TextWriter tw = new System.IO.StringWriter(sb); _result.View.Render(viewContext, tw); var resultCache = sb.ToString(); //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(resultCache), ST); doc.Open(); //Loop through each element, don't bother wrapping in P tags foreach (var element in list) { doc.Add(element); } doc.Close(); pdfWriter.Close(); } 

el resultado de ese código es enter image description here

lo cual no es correcto, la palabra árabe debería ser “محمد”. entonces lo que necesito es configurar la dirección del documento para que sea de derecha a izquierda

EDITAR Gracias a @Romulus

Hice algunos pequeños cambios en su código, simplemente reemplacé la adición de elementos a PdfPCell para hacer un bucle en mi Html y establecer algunos atributos

  //Loop through each element, don't bother wrapping in P tags foreach (var element in list) { //Create a cell and add text to it //PdfPCell text = new PdfPCell(new Phrase(element.ToString(), f)); //Ensure that wrapping is on, otherwise Right to Left text will not display //text.NoWrap = false; //Add the cell to the table //table.AddCell(text); if (element is iTextSharp.text.pdf.PdfPTable) { table = (iTextSharp.text.pdf.PdfPTable)element; table.DefaultCell.NoWrap = false; table.RunDirection = PdfWriter.RUN_DIRECTION_RTL; foreach (PdfPRow row in table.Rows) { foreach (PdfPCell cell in row.GetCells()) { cell.RunDirection = PdfWriter.RUN_DIRECTION_RTL; cell.NoWrap = false; } } } } 

Eso está funcionando para mí ahora bien Gracias 🙂

Necesita utilizar elementos contenedores que admitan RunDirection, como ColumnText o PdfPCell y luego establecer su elemento.RunDirection = PdfWriter.RUN_DIRECTION_RTL

 List list = HTMLWorker.ParseToList(new StringReader(resultCache), ST); doc.Open(); //Use a table so that we can set the text direction PdfPTable table = new PdfPTable(1); //Ensure that wrapping is on, otherwise Right to Left text will not display table.DefaultCell.NoWrap = false; table.RunDirection = PdfWriter.RUN_DIRECTION_RTL; //Loop through each element, don't bother wrapping in P tags foreach (var element in list) { //Create a cell and add text to it PdfPCell text = new PdfPCell(new Phrase(element, font)); //Ensure that wrapping is on, otherwise Right to Left text will not display text.NoWrap = false; //Add the cell to the table table.AddCell(text); } //Add the table to the document document.Add(table); doc.Close(); pdfWriter.Close(); 

Para referencia adicional, eche un vistazo a esta muestra .