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 に答える
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 に答える
2

私は iTextSharp ライブラリに慣れていません。ただし、 gridview コンポーネントの出力を文字列に変換し、その文字列から読み取って PDF ドキュメントを作成しているようです。また、UTF-8 から UTF-8 への奇妙な変換が行われています。

私が見ることができることから (GridView が文字を正しく出力している場合)、文字を文字列に出力している場合、それらはメモリ内で UTF-16 として表されます。おそらく、この文字列を PDF ライブラリに直接渡す必要があります (生の UTF-16 .NET 文字列をそのまま渡す方法と同様"İııŞŞşşĞĞğğ")。

于 2009-08-24T13:20:11.330 に答える
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);

1行目に「windows-1254」の代わりにこれらを書いても構いません。すべての作品:

  • Cp1254
  • iso-8859-9
  • Windows-1254
于 2010-09-01T13:49:48.113 に答える
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()

于 2009-08-24T23:59:39.203 に答える
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

この問題を解決するために、itextsharp のソース コードを変更しないことを強くお勧めします。この件に関する私の他のコメントをご覧ください: https://stackoverflow.com/a/24587745/1138663

于 2014-07-05T15:14:14.400 に答える