12 Ağustos 2013 Pazartesi

ITextSharp Türkçe Karakter Sorunu


ITextSharp ile pdf çıktısı oluştururken Türkçe karakterler görünmeyebiliyor. Bu sorunu aşmak için yeni bir font tanımlayıp,

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



ekleyeceğin metinlerde de parametre olarak bu fontu eklemen gerekiyor. Örnek olarak pdftable adında bir tabloya yeni bir hücre eklerken;

pdftable.AddCell(new Phrase("ğüşıöç ĞÜŞİÖÇ" , fontNormal));
gibi.

9 yorum:

  1. en sonunda nimet oldu bu benim için teşekkürler

    YanıtlaSil
  2. Teşekkürler.. Problemim çözüldü. UTF dönüştürmek bile gerekmedi.

    YanıtlaSil
  3. En Kolay Çözüm. Teşekkürler

    YanıtlaSil
  4. Merhaba bu sorunu Perpetuumsoft SharpShooter Reports windows 10 2018 şubat güncellemelerinden sonra yaşamaya başlamıştım.
    iTextSharp 4.1.6 versiyonunu kullanıyordu raporlama aracı uzun zamandır yapamıyordum sonunda iTextSharp kaynak kodlarında yukarıdaki kodu entegre ederek çözdüm teşekkürler.
    aynı sorunu yaşayan varsa; bf null geldiği için olmuyormuş.
    iTextSharp.text.font.cs içinde:

    public Font(BaseFont bf, float size, int style, Color color) {
    iTextSharp.text.pdf.BaseFont STF_Helvetica_Turkish = iTextSharp.text.pdf.BaseFont.CreateFont("Helvetica", "CP1254", iTextSharp.text.pdf.BaseFont.NOT_EMBEDDED);
    if (bf == null) {
    bf = STF_Helvetica_Turkish;
    }
    this.baseFont = bf;
    this.size = size;
    this.style = style;
    this.color = color;
    }

    YanıtlaSil
    Yanıtlar
    1. Teşekkür etmeyi unutmuşum :)
      Teşekkürler Caner Kara

      Sil
  5. StringWriter sw = new StringWriter();
    HtmlTextWriter hw = new HtmlTextWriter(sw);
    hw.AddStyleAttribute("font-size", "10pt");
    hw.AddAttribute("class", "textmode");
    this.panel1.RenderControl(hw);

    StringReader sr = new StringReader(sw.ToString());
    Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 90f, 0f);
    HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
    PdfWriter writer = PdfWriter.GetInstance(pdfDoc, Response.OutputStream);

    pdfDoc.Open();

    var logo = iTextSharp.text.Image.GetInstance(Server.MapPath("~/gfx/logo.png"));
    logo.SetAbsolutePosition(130, 750);
    pdfDoc.Add(logo);

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

    htmlparser.Parse(sr);
    pdfDoc.Close();

    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", "attachment;filename=" + fileName + "_nolu_siparis.pdf");
    Response.Charset = "UTF-8";
    Response.ContentEncoding = System.Text.Encoding.UTF8;
    Response.BinaryWrite(System.Text.Encoding.UTF8.GetPreamble());
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Buffer = true;
    Response.Write(pdfDoc);
    Response.End();

    kod yapım bu şekildedir. Font u nasıl ekleyebilirim? bu şekilde Ş ve I harfi görünmüyor.

    YanıtlaSil
    Yanıtlar
    1. Sanırım HTML'den PDF'e dönüşüm yapmaya çalışıyorsunuz. İnternet üzerinde arama yapınca HTMLWorker sınıfı deprecated görünüyor. Bunun yerine tüm PDF sayfasını logoyu sayfaya eklediğiniz şekilde oluşturursanız font belirleyip bu fontu diğer metin ekleme metodlarına parametre olarak göndererek kullanabiliyorsunuz. Mesela;

      var document = new Document(PageSize.A4, 20, 20, 20, 20);
      var output = new MemoryStream();
      var writer = PdfWriter.GetInstance(document, output);

      document.Open();

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

      Paragraph p = new Paragraph();
      Chunk yazi = new Chunk("Lorem ipsum dolor set amet.\n", fontNormal);
      p.Add(yazi);
      document.Add(p);

      document.Close();

      HttpContext.Current.Response.ContentType = "application/pdf";
      HttpContext.Current.Response.AddHeader("Content-Disposition","attachment;filename=form.pdf");
      HttpContext.Current.Response.BinaryWrite(output);

      Kodu denemedim ama çalışacağını düşünüyorum.

      İyi çalışmalar...

      Sil
  6. Yuarıdaki kodu ekleyince ; Android telefonlarda yine sorun devam ediyor. WEb de ve iphne da sorun yok.

    YanıtlaSil