2009-08-24 130 views
9

我想通过使用itextsharp库将gridview导出为pdf。问题在于pdf文档中缺少一些土耳其字符,例如©,ı,Ş,等等。用于导出PDF的代码是:HTML到pdf某些字符丢失(itextsharp)

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

回答

7

Finaly我想我找到的解决方案,我为了显示土耳其字符改变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,缺少的字符显示。

+0

这完美的作品。特别是当出口gridview到PDF。非常感谢。 – bselvan 2013-01-31 09:55:22

+0

谢谢。它在一开始并不起作用。除您之外,我搜索整个项目并更改所有“BaseFont.WINANSI” - >“BaseFont.CP1254”。然后它完美地工作。 – VVovoVV 2013-10-07 08:45:02

2

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

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

+0

对不起,UTF-8到UTF-8的转换,它只是试用,我在写问题的时候就这样忘记了。我尝试了不同的组合,比如UTF-8到Unicode ,Unicode到UTF-8等... – slayer35 2009-08-24 13:36:43

+0

我想说的是:当你不做任何转换时会发生什么?没有转换的 – paracycle 2009-08-24 13:42:20

+0

,字符仍然丢失。 – slayer35 2009-08-24 13:56:07

1

土耳其编码

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

如果您输出HTML,在页面顶部尝试不同的DOCTYPE标签。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 

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

Server.HTMLEncode()

HttpServerUtility.HtmlEncode()

+0

我做了你说的,但没有任何改变。我认为我们必须改变htmlworker的字体,但不知道如何。 谢谢 – slayer35 2009-08-25 08:55:41

5

无需更改源代码。

试试这个:

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); 
+0

@Jason Plank这个字体是否可以分配给LoadTagStyle中的html标签主体? – Alex 2012-07-18 10:55:56

+0

这应该是答案! (fontFont.HELVETICA,“Cp1254”,BaseFont.NOT_EMBEDDED,24,Font.BOLD,BaseColor.BLACK); – kaya 2015-11-23 13:43:56

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

在第一行,你可以写这些,而不是 “窗口-1254” 的。所有作品:

  • Cp1254
  • ISO-8859-9
  • 窗口-1254
2

您可以使用:

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); 
+0

@Jason Plank这个字体是否可以分配给LoadTagStyle中的html标签主体? – Alex 2012-07-18 10:57:25

+0

@Alex我不知道,我只修复了这个答案的格式。不幸的是,这个答案的作者似乎并没有在这里活跃起来。 – 2012-07-19 14:21:57

+0

@Jason Plank是的,非常糟糕 – Alex 2012-07-19 14:27:02

-1

我解决了这个问题。我可以提供我的另一种解决方案类型...

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) 
{ 

} 
0

不要更改iTextSharp的源代码。定义一种新的风格:

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

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

0

我终于找到了这个问题的灵魂,通过这个你可以打印所有的土耳其字符。

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

非常感谢所有谁张贴的样本..

我用从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); 
        } 
       }