10

我想使用 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));
4

11 回答 11

8

最后我想我找到了解决方案,我稍微更改了 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 后,会显示缺少的字符。

于 2009-08-26T11:35:15.303 回答
7

无需更改源代码。

试试这个:

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);
于 2009-10-13T16:23:11.193 回答
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);
                    }
                }
于 2014-04-10T16:00:21.890 回答
2

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

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

于 2009-08-24T13:20:11.330 回答
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);
于 2011-03-29T08:35:39.357 回答
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。

服务器.HTMLEncode()

HttpServerUtility.HtmlEncode()

于 2009-08-24T23:59:39.203 回答
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
  • windows-1254
于 2010-09-01T13:49:48.113 回答
0

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

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

}
于 2012-12-12T10:18:01.877 回答
0

不要更改 iTextSharp 的源代码。定义新样式:

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

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

于 2012-12-13T05:27:31.577 回答
0

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

字符串 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));
于 2014-01-29T13:01:33.403 回答
0

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

于 2014-07-05T15:14:14.400 回答