使用itextsharp将阿拉伯语“unicode”内容html或xml转换为pdf

我试图在我的asp.net MVC3应用程序中创建报告经过大量搜索我发现许多博客文章谈论ITextSharp将我的Html/Razor转换为Pdf我试图解析剃刀视图以获得PDf如下

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

该代码的结果是 在此处输入图像描述

这是不正确的,阿拉伯语单词应该是“محمد”。 所以我需要的是将文档方向设置为从右到左

编辑感谢@Romulus

我对他的代码做了一些改动,我只是将添加元素替换为PdfPCell来循环我的Html并设置一些属性

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

那对我来说现在很好谢谢:)

您需要使用支持RunDirection的容器元素,例如ColumnText或PdfPCell,然后设置它们的元素.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(); 

有关添加参考,请查看此示例 。