title: iTextSharp to print a gridview
body: <p>I use iTextSharp to print a grid view but I face some problems:</p>
  
  <ol>
  <li><p>No arabic characters appears at all.</p></li>
  <li><p>The direction is LTR and I wany it RTL instead.</p></li>
  <li><p>Some columns in the gridview are templatefields (label, imagebutton,...), and I can't handle this case. I won't show all of them (like delete button , ...)</p></li>
  </ol>
  
  <p>The code :</p>
  
  <pre><code> protected void ExportToPDF(GridView gvReport, bool LandScape)
          {
              int noOfColumns = 0, noOfRows = 0;
              DataTable tbl = null;
  
              if (gvReport.AutoGenerateColumns)
              {
                  tbl = gvReport.DataSource as DataTable; // Gets the DataSource of the GridView Control.
                  noOfColumns = tbl.Columns.Count;
                  noOfRows = tbl.Rows.Count;
              }
              else
              {
                  noOfColumns = gvReport.Columns.Count;
                  noOfRows = gvReport.Rows.Count;
              }
  
              float HeaderTextSize = 8;
              float ReportNameSize = 10;
              float ReportTextSize = 8;
              float ApplicationNameSize = 7;
  
              // Creates a PDF document
  
              Document document = null;
              if (LandScape == true)
              {
                  // Sets the document to A4 size and rotates it so that the     orientation of the page is Landscape.
                  document = new Document(PageSize.A4.Rotate(), 0, 0, 15, 5);
              }
              else
              {
                  document = new Document(PageSize.A4, 0, 0, 15, 5);
              }
  
              // Creates a PdfPTable with column count of the table equal to no of columns of the gridview or gridview datasource.
              iTextSharp.text.pdf.PdfPTable mainTable = new iTextSharp.text.pdf.PdfPTable(noOfColumns);
  
              // Sets the first 4 rows of the table as the header rows which will be repeated in all the pages.
              mainTable.HeaderRows = 4;
  
              // Creates a PdfPTable with 2 columns to hold the header in the exported PDF.
              iTextSharp.text.pdf.PdfPTable headerTable = new iTextSharp.text.pdf.PdfPTable(2);
  
              // Creates a phrase to hold the application name at the left hand side of the header.
              Phrase phApplicationName = new Phrase("Contact List", FontFactory.GetFont("Arial", ApplicationNameSize, iTextSharp.text.Font.TIMES_ROMAN));
  
              // Creates a PdfPCell which accepts a phrase as a parameter.
              PdfPCell clApplicationName = new PdfPCell(phApplicationName);
              // Sets the border of the cell to zero.
              clApplicationName.Border = PdfPCell.NO_BORDER;
              // Sets the Horizontal Alignment of the PdfPCell to left.
              clApplicationName.HorizontalAlignment = Element.ALIGN_LEFT;
  
              // Creates a phrase to show the current date at the right hand side of the header.
              Phrase phDate = new Phrase(DateTime.Now.Date.ToString("dd/MM/yyyy"), FontFactory.GetFont("Arial", ApplicationNameSize, iTextSharp.text.Font.NORMAL));
  
              // Creates a PdfPCell which accepts the date phrase as a parameter.
              PdfPCell clDate = new PdfPCell(phDate);
              // Sets the Horizontal Alignment of the PdfPCell to right.
              clDate.HorizontalAlignment = Element.ALIGN_RIGHT;
              // Sets the border of the cell to zero.
              clDate.Border = PdfPCell.NO_BORDER;
  
              // Adds the cell which holds the application name to the headerTable.
              headerTable.AddCell(clApplicationName);
              // Adds the cell which holds the date to the headerTable.
              headerTable.AddCell(clDate);
              // Sets the border of the headerTable to zero.
              headerTable.DefaultCell.Border = PdfPCell.NO_BORDER;
  
              // Creates a PdfPCell that accepts the headerTable as a parameter and then adds that cell to the main PdfPTable.
              PdfPCell cellHeader = new PdfPCell(headerTable);
              cellHeader.Border = PdfPCell.NO_BORDER;
              // Sets the column span of the header cell to noOfColumns.
              cellHeader.Colspan = noOfColumns;
              // Adds the above header cell to the table.
              mainTable.AddCell(cellHeader);
  
              // Creates a phrase which holds the file name.
              Phrase phHeader = new Phrase("Contact List", FontFactory.GetFont("Arial", ReportNameSize, iTextSharp.text.Font.BOLD));
              PdfPCell clHeader = new PdfPCell(phHeader);
              clHeader.Colspan = noOfColumns;
              clHeader.Border = PdfPCell.NO_BORDER;
              clHeader.HorizontalAlignment = Element.ALIGN_CENTER;
              mainTable.AddCell(clHeader);
  
              // Creates a phrase for a new line.
              Phrase phSpace = new Phrase("\n");
              PdfPCell clSpace = new PdfPCell(phSpace);
              clSpace.Border = PdfPCell.NO_BORDER;
              clSpace.Colspan = noOfColumns;
              mainTable.AddCell(clSpace);
  
              // Sets the gridview column names as table headers.
              for (int i = 0; i &lt; noOfColumns; i++)
              {
                  Phrase ph = null;
  
                  if (gvReport.AutoGenerateColumns)
                  {
                      ph = new Phrase(tbl.Columns[i].ColumnName, FontFactory.GetFont("Arial", HeaderTextSize, iTextSharp.text.Font.BOLD));
                  }
                  else
                  {
                      ph = new Phrase(gvReport.Columns[i].HeaderText, FontFactory.GetFont("Arial", HeaderTextSize, iTextSharp.text.Font.BOLD));
                  }
  
                  mainTable.AddCell(ph);
              }
  
              // Reads the gridview rows and adds them to the mainTable
              for (int rowNo = 0; rowNo &lt; noOfRows; rowNo++)
              {
                  for (int columnNo = 0; columnNo &lt; noOfColumns; columnNo++)
                  {
                      if (gvReport.AutoGenerateColumns)
                      {
                          string s = gvReport.Rows[rowNo].Cells[columnNo].Text.Trim();
                          Phrase ph = new Phrase(s, FontFactory.GetFont("Arial", ReportTextSize, iTextSharp.text.Font.NORMAL));
                          mainTable.AddCell(ph);
                      }
                      else
                      {
                          if (gvReport.Columns[columnNo] is TemplateField)
                          {
                              try
                              {
                                  Label lc = gvReport.Rows[rowNo].Cells[columnNo].Controls[1] as Label;
  
                                  string s = lc.Text.Trim();
                                  Phrase ph = new Phrase(s, FontFactory.GetFont("Arial", ReportTextSize, iTextSharp.text.Font.NORMAL));
                                  mainTable.AddCell(ph);
                              }
                              catch (NullReferenceException ee)
                              {
                                  noOfColumns--;
                              }
                              catch (Exception ee)
                              {
                                  noOfColumns--;
                              }
                          }
                          else
                          {
                              string s = gvReport.Rows[rowNo].Cells[columnNo].Text.Trim();
                              Phrase ph = new Phrase(s, FontFactory.GetFont("Arial", ReportTextSize, iTextSharp.text.Font.NORMAL));
                              mainTable.AddCell(ph);
                          }
                      }
                  }
  
                  // Tells the mainTable to complete the row even if any cell is left incomplete.
                  mainTable.CompleteRow();
              }
  
              // Gets the instance of the document created and writes it to the output stream of the Response object.
              PdfWriter.GetInstance(document, Response.OutputStream);
  
              // Creates a footer for the PDF document.
              HeaderFooter pdfFooter = new HeaderFooter(new Phrase(), true);
              pdfFooter.Alignment = Element.ALIGN_CENTER;
              pdfFooter.Border = iTextSharp.text.Rectangle.NO_BORDER;
  
              // Sets the document footer to pdfFooter.
              document.Footer = pdfFooter;
              // Opens the document.
              document.Open();
              // Adds the mainTable to the document.
              document.Add(mainTable);
              // Closes the document.
              document.Close();
  
              Response.ContentType = "application/pdf";
              Response.AddHeader("content-disposition", "attachment; filename= ContactList.pdf");
              Response.End();
          }
  </code></pre>
  
  <hr>
  
  <p>The original one is <a href="http://www.dotnetspider.com/resources/29759-Exporting-GridView-PDF.aspx">Here</a></p>
  
  <p>I change this line and add try and catch to avoid the exception (problem 3) :</p>
  
  <pre><code>DataBoundLiteralControl lc = gvReport.Rows[rowNo].Cells[columnNo].Controls[0] as DataBoundLiteralControl;
  </code></pre>
  
  <p>TO</p>
  
  <pre><code>Label lc = gvReport.Rows[rowNo].Cells[columnNo].Controls[1] as Label;
  </code></pre>
  
  <p>How to fix these problems?</p>