Html到pdf一些字符丢失(itextsharp)

我想使用itextsharp库将gridview导出为pdf。 问题是在pdf文档中缺少一些土耳其字符,如İ,ı,Ş,ş等。 用于导出pdf的代码是:

protected void LinkButtonPdf_Click(object sender, EventArgs e) { Response.ContentType = "application/pdf"; Response.ContentEncoding = System.Text.Encoding.UTF8; Response.AddHeader("content-disposition", "attachment;filename=FileName.pdf"); Response.Cache.SetCacheability(HttpCacheability.NoCache); System.IO.StringWriter stringWrite = new StringWriter(); System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); GridView1.RenderControl(htmlWrite); StringReader reader = new StringReader(textConvert(stringWrite.ToString())); Document doc = new Document(PageSize.A4); HTMLWorker parser = new HTMLWorker(doc); PdfWriter.GetInstance(doc, Response.OutputStream); doc.Open(); parser.Parse(reader); doc.Close(); } public static string textConvert(string S) { if (S == null) { return null; } try { System.Text.Encoding encFrom = System.Text.Encoding.UTF8; System.Text.Encoding encTo = System.Text.Encoding.UTF8; string str = S; Byte[] b = encFrom.GetBytes(str); return encTo.GetString(b); } catch { return null; } } 

注意:当我想在pdf文档中插入字符时,其中会显示缺少的字符。 我用这段代码插入字符:

  BaseFont bffont = BaseFont.CreateFont("C:\\WINDOWS\\Fonts\\arial.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); Font fontozel = new Font(bffont, 12, Font.NORMAL, new Color(0, 0, 0)); doc.Add(new Paragraph("İİııŞŞşşĞĞğğ", fontozel)); 

最后我想我找到了解决方案,为了显示土耳其字符,我稍微改变了一下itextsharp源代码。(土耳其字符代码是cp1254)

我在源代码中将“ public const string CP1254 = "Cp1254"; ”添加到[BaseFont.cs]。

之后我修改了[FactoryProperties.cs]。我这样改了;

 public Font GetFont(ChainedProperties props) { I don't write the whole code.I changed only code below; ------------Default itextsharp code------------------------------------------------------ if (encoding == null) encoding = BaseFont.WINANSI; return fontImp.GetFont(face, encoding, true, size, style, color); -------------modified code-------------------------------------------- encoding = BaseFont.CP1254; return fontImp.GetFont("C:\\WINDOWS\\Fonts\\arial.ttf", encoding, true, size, style, color); } 

。编译新的dll后,显示缺少的字符。

无需更改源代码。

试试这个:

 iTextSharp.text.pdf.BaseFont STF_Helvetica_Turkish = iTextSharp.text.pdf.BaseFont.CreateFont("Helvetica","Cp1254", iTextSharp.text.pdf.BaseFont.NOT_EMBEDDED); iTextSharp.text.Font fontNormal = new iTextSharp.text.Font(STF_Helvetica_Turkish, 12, iTextSharp.text.Font.NORMAL); 

非常感谢所有发布样品的人..

我使用codeproject中的以下解决方案,并且由于字体而存在土耳其字符集问题。

如果您使用htmlworker,您应该注册字体并传递给htmlworker

http://www.codeproject.com/Articles/260470/PDF-reporting-using-ASP-NET-MVC3

  StyleSheet styles = new iTextSharp.text.html.simpleparser.StyleSheet(); styles.LoadTagStyle("h3", "size", "5"); styles.LoadTagStyle("td", "size", ".6"); FontFactory.Register("c:\\windows\\fonts\\arial.ttf", "Garamond"); // just give a path of arial.ttf styles.LoadTagStyle("body", "face", "Garamond"); styles.LoadTagStyle("body", "encoding", "Identity-H"); styles.LoadTagStyle("body", "size", "12pt"); using (var htmlViewReader = new StringReader(htmlText)) { using (var htmlWorker = new HTMLWorker(pdfDocument, null, styles)) { htmlWorker.Parse(htmlViewReader); } } 

我不熟悉iTextSharp库; 但是,您似乎将gridview组件的输出转换为字符串并从该字符串中读取以构建PDF文档。 你也有从UTF-8到UTF-8的奇怪转换。

从我所看到的(假设您的GridView正确输出字符)如果您将字符输出到字符串,它们将在内存中表示为UTF-16。 您可能需要将此字符串直接传递到PDF库中(就像您传递原始UTF-16 .NET字符串"İııŞŞşşĞĞğğ"一样)。

您可以使用:

 iTextSharp.text.pdf.BaseFont Vn_Helvetica = iTextSharp.text.pdf.BaseFont.CreateFont(@"C:\Windows\Fonts\arial.ttf", "Identity-H", iTextSharp.text.pdf.BaseFont.EMBEDDED); iTextSharp.text.Font fontNormal = new iTextSharp.text.Font(Vn_Helvetica, 12, iTextSharp.text.Font.NORMAL); 

对于土耳其编码

 CultureInfo ci = new CultureInfo("tr-TR"); Encoding enc = Encoding.GetEncoding(ci.TextInfo.ANSICodePage); 

如果您要输出HTML,请尝试页面顶部的不同DOCTYPE标记。

  

请注意,如果使用HTML,您可能需要HTMLEncode字符。

Server.HTMLEncode()

HttpServerUtility.HtmlEncode()

 BaseFont bF = BaseFont.CreateFont("c:\\arial.ttf","windows-1254",true); Font f = new Font(bF,12f,Font.NORMAL); Chunk c = new Chunk(); c.Font = f; c.Append("Turkish characters: ĞÜŞİÖÇ ğüşıöç"); document.Add(c); 

在第一行中,您可以编写这些而不是“windows-1254”。 所有作品:

  • Cp1254
  • ISO-8859-9
  • 窗户-1254

请勿更改iTextSharp的源代码。 定义新样式:

  var styles = new StyleSheet(); styles.LoadTagStyle(HtmlTags.BODY, HtmlTags.FONTFAMILY, "tahoma"); styles.LoadTagStyle(HtmlTags.BODY, HtmlTags.ENCODING, "Identity-H"); 

然后将其传递给HTMLWorker.ParseToList方法。

我终于找到了这个问题的灵魂,你可以打印出所有土耳其人的角色。

String htmlText = html.ToString();

  Document document = new Document(); string filePath = HostingEnvironment.MapPath("~/Content/Pdf/"); PdfWriter.GetInstance(document, new FileStream(filePath + "\\pdf-"+Name+".pdf", FileMode.Create)); document.Open(); iTextSharp.text.html.simpleparser.HTMLWorker hw = new iTextSharp.text.html.simpleparser.HTMLWorker(document); FontFactory.Register(Path.Combine(_webHelper.MapPath("~/App_Data/Pdf/arial.ttf")), "Garamond"); // just give a path of arial.ttf StyleSheet css = new StyleSheet(); css.LoadTagStyle("body", "face", "Garamond"); css.LoadTagStyle("body", "encoding", "Identity-H"); css.LoadTagStyle("body", "size", "12pt"); hw.SetStyleSheet(css); hw.Parse(new StringReader(htmlText)); 

我强烈建议不要更改itextsharp源代码以解决此问题。 看看我对该主题的其他评论: https : //stackoverflow.com/a/24587745/1138663

我解决了这个问题。 我可以提供我的其他解决方案类型……

 try { BaseFont bf = BaseFont.CreateFont("c:\\windows\\fonts\\calibrib.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); Document document = new Document(PageSize.A4, 25, 25, 30, 30); PdfWriter writer = PdfWriter.GetInstance(document, fs); Font f = new Font(bf, 12f, Font.NORMAL); // Open the document to enable you to write to the document document.Open(); // Add a simple and wellknown phrase to the document for (int x = 0; x != 100; x++) { document.Add(new Paragraph("Paragraph - This is a test! ÇçĞğİıÖöŞşÜü",f)); } // Close the document document.Close(); } catch(Exception) { }