Create pdf in csharp for arabic, persian and urdu


Generating pdf in C# for Arabic, Persian and Urdu using itextsharp
  • create new project (window application)
  • download itextsharp version(5.5.10.0)  from Here
  • add reference of itextSharp.dll to your project
  • Add a button to form
  • Add DataGridView to your form(dataGridView1)
  • Add a class to your project GlobalData.cs
  • Add a class your project PdfUtil.cs
All these three languages are RTL (Righ-to-left). itextsharp provides PdfWriter.RunDirection property to set the direction to (RTL/LTR) it can be set by using this code snippet.

PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream( Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/Report.pdf", FileMode.Create));
writer.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
Right to left languages can be appear by setting the font that supports the right-to-left. In this article i am setting the font to times.ttf which support the RTL language. the function for setting font which i used is the follwing this belongs to the class PdfUtil.cs. this function takes single argument basecolor for setting the font color
public iTextSharp.text.Font GetFont(BaseColor fontColor)
{
BaseFont bf = BaseFont.CreateFont("c:\\windows\\fonts\\times.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
var fnt = new iTextSharp.text.Font(bf, 13.0f, 1, fontColor);
return fnt;
}
if you want to add paragraph directly to pdf document then it will display scattered text i-e every character will be an isolated. But it can be displayed by using PdfpTable class. so we will use a trick here to display a paragraph in table by setting all of its border to white. Here is the code snippet. A Paragraph function of (PdfUtill class.
public PdfPTable Paragraph(string text)
{
PdfPTable tbl = new PdfPTable(1);
tbl.WidthPercentage = 100;
tbl.SpacingBefore = 5;
tbl.SpacingAfter = 10;
tbl.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
Paragraph p = new iTextSharp.text.Paragraph(5.5f,text, GetFont(BaseColor.BLACK));
PdfPCell c = new PdfPCell(p);
c.BorderColor = BaseColor.WHITE;
tbl.AddCell(c);
return tbl;
}
You can see the resulting document here

In this article i also picked the data from database and static data also.
Full code
GlobalData.cs should look like this.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

  public  class GlobalData
    {
      // you can read connection string from web.config/app.config
      // Connect to database
      SqlConnection con = new SqlConnection("Data Source=NORTH\\SQLSERVER2008;Initial Catalog=test;Integrated Security=SSPI;");
      public GlobalData(){}
      public DataTable GetData(string query)
      {
          SqlDataAdapter da=new SqlDataAdapter(query,con);
          DataTable dtToReturn=new DataTable();
          da.Fill(dtToReturn);
          return dtToReturn ;
      }
    }

PdfUtil.cs should look Like this


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using iTextSharp.text;
using iTextSharp.text.pdf;
namespace BarcodeAp
{
   public class PdfUtil
    {
       public iTextSharp.text.Font GetFont(BaseColor fontColor)
       {
           BaseFont bf = BaseFont.CreateFont("c:\\windows\\fonts\\times.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
           var fnt = new iTextSharp.text.Font(bf, 13.0f, 1, fontColor);
           return fnt;
       }
       public PdfPTable Paragraph(string text)
       {
           PdfPTable tbl = new PdfPTable(1);
           tbl.WidthPercentage = 100;
           tbl.SpacingBefore = 5;
           tbl.SpacingAfter = 10;
           tbl.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
           Paragraph p = new iTextSharp.text.Paragraph(5.5f,text, GetFont(BaseColor.BLACK));          
           PdfPCell c = new PdfPCell(p);
           c.BorderColor = BaseColor.WHITE;
           tbl.AddCell(c);
           return tbl;
       }
       public PdfPTable Paragraph(string text,BaseColor fontcolor)
       {
           PdfPTable tbl = new PdfPTable(1);
           tbl.WidthPercentage = 100;
           tbl.SpacingBefore = 5;
           tbl.SpacingAfter = 10;
           tbl.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
           PdfPCell c = new PdfPCell(new Phrase(text, GetFont(fontcolor)));
           c.BorderColor = BaseColor.WHITE;
           tbl.AddCell(c);
           return tbl;
       }
       public PdfPCell Cell(string text)
       {
           PdfPCell c = new PdfPCell();
           c.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
           Phrase p = new Phrase(text, GetFont(BaseColor.BLACK));
           c.AddElement(p);
           return c;
       }
    }
}

Finally the code for your form.cs should look like this


using iTextSharp.text;
using iTextSharp.text.pdf;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace BarcodeAp
{
    public partial class GeneratePdf : Form
    {
        public GeneratePdf()
        {
            InitializeComponent();
        }

        private void GeneratePdf_Load(object sender, EventArgs e)
        {
            GlobalData db = new GlobalData();
            dataGridView1.DataSource = db.GetData("select * from Employee");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Document doc = new Document(PageSize.A4);

            try
            {
                PdfUtil pdf = new PdfUtil();
                PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(
                  Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/Report.pdf", FileMode.Create));
                writer.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
                doc.Open();               
                PdfPTable tbl = new PdfPTable(4);
                tbl.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
                DataTable dt = new GlobalData().GetData("select * from Employee");
                tbl.PaddingTop = 10.5f;               
                doc.Add(pdf.Paragraph(@"رفضت محكمة الاستئناف الاتحادية في الولايات المتحدة الطعن الذي تقدمت به إدارة ترامب في قرار قاض اتحادي بوقف مؤقت لقرار حظر سفر مواطني سبع دول ذات أغلبية مسلمة والمهاجرين إلى الولايات المتحدة."));
                doc.Add(pdf.Paragraph(@"وأصدر قاضي المحكمة الفيدرالية في سياتل قرارا ضد وزارة العدل الأمريكية، رافضا ما زعمته من أنه ليس لدى إدارات الولايات الأمريكية صلاحية تخولها رفض الأمر التنفيذي الصادر من الرئيس دونالد ترامب، ولا يمكنها أيضا مناقشة تقديراته للمخاطر التي تهدد الأمن القومي.", BaseColor.GRAY));
                doc.Add(pdf.Paragraph(@"ولذلك تم التقليل من أهمية أنشطة إيران الإقليمية، مثل دعمها لحركة حماس وحزب الله ودعمها العسكري لنظام بشار الأسد ودعمها للحوثيين في اليمن ونفوذها المتنامي في العراق، من أجل ضمان استمرار المفاوضات بهدف التوصل لاتفاق بشأن البرنامج النووي.", BaseColor.RED));
                doc.Add(pdf.Paragraph(@"هفته پیش آزمایش موشکی ایران با واکنش منفی کشورهای غربی و اسرائیل روبه‌رو شد که آن را ناقض قطعنامه شورای امنیت سازمان ملل متحد برشمردند.
اما مقام‎های ایرانی از جمله محمد جواد ظریف، وزیر امورخارجه گفتند که هیچ یک از موشک‌های ایران برای حمل کلاهک‌های هسته‌ای طراحی نشده‌ بنابراین آزمایش موشکی ایران قطعنامه ۲۲۳۱ را نقض نمی‌کند.", BaseColor.BLACK));
                doc.Add(pdf.Paragraph(@"امریکی اپیل کورٹ نے ٹرمپ انتظامیہ کی جانب سے سات اسلامی ملکوں کے شہریوں پر عائد سفری پابندیاں بحال کرنے کی اپیل مسترد کر دی ہے۔
اس فیصلے کا مطلب یہ ہے کہ صدر ٹرمپ کا سفری پابندیوں والا انتظامی حکم نامہ اس وقت تک معطل رہے گا جب تک اس مقدمے کا حتمی فیصلہ نہیں آ جاتا۔
عدالت نے وائٹ ہاؤس اور ریاستوں کو پیر تک کا وقت دیا ہے کہ وہ اس بارے میں مزید دلائل پیش کریں۔", BaseColor.BLUE));

                foreach (DataColumn c in dt.Columns)
                {
                    tbl.AddCell(new Phrase(c.Caption));
                }
                foreach(DataRow row in dt.Rows)
                {
                    
                   tbl.AddCell(pdf.Cell(row[0].ToString()));
                   tbl.AddCell(pdf.Cell(row[1].ToString()));
                   tbl.AddCell(pdf.Cell(row[2].ToString()));
                   tbl.AddCell(pdf.Cell(row[3].ToString()));   
                }
                doc.Add(tbl);
                doc.Close();
                System.Diagnostics.Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/Report.pdf");
            }
            catch(Exception ae)
            {
                MessageBox.Show(ae.Message);
            }
        }
    }
}

Your form design should look like this


Post a Comment