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

时间:2009-08-24 13:08:15

标签: c# .net asp.net pdf-generation 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));

11 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分: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);

答案 2 :(得分: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);
                    }
                }

答案 3 :(得分:2)

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

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

答案 4 :(得分: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);

答案 5 :(得分: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()

答案 6 :(得分: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);

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

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

答案 7 :(得分:0)

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

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

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

答案 8 :(得分:0)

我终于找到了这个问题的解决方案,通过这个你可以打印所有土耳其人的角色。

强html Text = 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));

答案 9 :(得分:0)

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

答案 10 :(得分:-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)
{

}