2012-06-19 101 views
8

utilizo iTextSharp para imprimir una vista de cuadrícula pero se enfrentan a algunos problemas:iTextSharp para imprimir un gridview

  1. No hay caracteres arábigos aparece en absoluto.

  2. La dirección es LTR y en vez de eso quiero RTL.

  3. Algunas columnas en la vista de cuadrícula son campos de plantilla (etiqueta, botón de imagen, ...), y no puedo manejar este caso. No voy a mostrar todos ellos (como el botón de borrar, ...)

El código:

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 < 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 < noOfRows; rowNo++) 
      { 
       for (int columnNo = 0; columnNo < 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(); 
     } 

El original es Here

cambio de esta línea y agregue try y catch para evitar la excepción (problema 3):

DataBoundLiteralControl lc = gvReport.Rows[rowNo].Cells[columnNo].Controls[0] as DataBoundLiteralControl; 

A

Label lc = gvReport.Rows[rowNo].Cells[columnNo].Controls[1] as Label; 

Cómo solucionar estos problemas?

+1

¿Qué hay en su GridView? ¿Tienes todos los datos de las columnas como árabe? – MMK

+0

no no todos los datos son árabes. –

+0

marque esta pregunta que puede ayudarlo http://stackoverflow.com/questions/16080741/convert-arabicunicode-content-html-or-xml-to-pdf-using-itextsharp –

Respuesta

8

enter image description here

En el Hacia fuera puesto se puede ver que las columnas en inglés LTR y Columna árabe en RTL. si desea visualizar GridView en la página con RTL, puede usar <div dir="rtl">Put the Grid View here</div>. GridView:

<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" AutoGenerateColumns="False"> 
     <Columns> 
      <asp:TemplateField HeaderText="العربية" SortExpression="العربية"> 
       <ItemTemplate> 
        <asp:Label ID="arabic" runat="server" Text='<%# Eval("العربية")%>' /> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
     <Columns> 
      <asp:TemplateField HeaderText="English" SortExpression="English"> 
       <ItemTemplate> 
        <asp:Label ID="english" runat="server" Text='<%# Eval("English") %>' /> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
     <Columns> 
      <asp:TemplateField> 
       <ItemTemplate> 
        <asp:Button ID="deleteButton" runat="server" Text="Delete" /> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
     <Columns> 
      <asp:TemplateField> 
       <ItemTemplate> 
        <asp:HyperLink ID="open" runat="server" Text="Open" NavigateUrl="~/Default.aspx"/> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
     SelectCommand="SELECT [English], [العربية] FROM [Test]"></asp:SqlDataSource> 
    <br /> 
    <asp:Button ID="btnExport" runat="server" OnClick="btnExport_Click" Text="Export to PDF" /> 

Código CS:

protected void ExportPDF(GridView gridViewReport) 
    { 
     int columnNumber = 0, rowNumber = 0; 
     DataTable tbl = null; 

     if (gridViewReport.AutoGenerateColumns) 
     { 
      tbl = gridViewReport.DataSource as DataTable; // Gets the DataSource of the GridView Control. 
      columnNumber = tbl.Columns.Count; 
      rowNumber = tbl.Rows.Count; 
     } 
     else 
     { 
      columnNumber = gridViewReport.Columns.Count; 
      rowNumber = gridViewReport.Rows.Count; 
     } 
     // Creates a PDF document 
     Document document = null; 
     document = new Document(PageSize.A4, 0, 0, 15, 5); 
     PdfPTable _table = new PdfPTable(GridView1.Columns.Count); 
     _table.RunDirection = PdfWriter.RUN_DIRECTION_RTL; 
     BaseFont baseFont = BaseFont.CreateFont("c:\\\\windows\\\\fonts\\\\tahoma.ttf", BaseFont.IDENTITY_H, true); // Font which has Arabic characters 
     iTextSharp.text.Font font = new iTextSharp.text.Font(baseFont, 10, iTextSharp.text.Font.NORMAL); 

     // Sets the gridview column names as table headers. 
     for (int i = 0; i < columnNumber; i++) 
     { 
      iTextSharp.text.pdf.PdfPCell ph = null; 

      if (gridViewReport.AutoGenerateColumns) 
      { 
       ph = new PdfPCell(new Phrase(10, tbl.Columns[i].ColumnName, font)); 
      } 
      else 
      { 
       ph = new PdfPCell(new Phrase(10, gridViewReport.Columns[i].HeaderText, font)); 
      } 
      if (ph != null && gridViewReport.Columns[i].HeaderText != "") 
      { 
       if (Regex.IsMatch(gridViewReport.Columns[i].HeaderText, "^[a-zA-Z0-9 ]*$")) // Check if Header Text is English 
       { 
        ph.RunDirection = PdfWriter.RUN_DIRECTION_LTR; // Left to Right 
        BaseColor color = new BaseColor(Color.Red); 
        ph.BackgroundColor = color; 
        _table.AddCell(ph); 
       } 
       else 
       { 
        ph.RunDirection = PdfWriter.RUN_DIRECTION_RTL; //Right to Left 
        BaseColor color = new BaseColor(Color.Red); 
        ph.BackgroundColor = color; 
        _table.AddCell(ph); 
       } 
      } 
      else 
      { 
       ph.Border = iTextSharp.text.Rectangle.NO_BORDER; 
       _table.AddCell(ph); 
      } 
     } 
     // Get the gridview rows and adds them to the _table 
     for (int rowIteration = 0; rowIteration < rowNumber; rowIteration++) 
     { 
      for (int columnIteration = 0; columnIteration < columnNumber; columnIteration++) 
      { 
       if (gridViewReport.AutoGenerateColumns) //Check if AutoGenrated Colunms 
       { 
        string s = gridViewReport.Rows[rowIteration].Cells[columnIteration].Text.Trim(); 
        PdfPCell ph = new PdfPCell(new Phrase(10, s, font)); 
        _table.AddCell(ph); 
       } 
       else 
       { 
        if (gridViewReport.Columns[columnIteration] is TemplateField) // Check if Item Template 
        { 
         PdfPCell ph = null; 
         Label lc = gridViewReport.Rows[rowIteration].Cells[columnIteration].Controls[1] as Label; // Label 
         Button btn = gridViewReport.Rows[rowIteration].Cells[columnIteration].Controls[1] as Button;// Button 
         HyperLink hyperLink = gridViewReport.Rows[rowIteration].Cells[columnIteration].Controls[1] as HyperLink; // HyperLink 

         if (lc != null) 
         { 

          string s = lc.Text.Trim(); 
          ph = new PdfPCell(new Phrase(10, s, font)); 
          if (Regex.IsMatch(s, "^[a-zA-Z0-9 ]*$")) //Check if cell string is English 
          { ph.RunDirection = PdfWriter.RUN_DIRECTION_LTR; // Left to Right 
           _table.AddCell(ph); 
          } 
          else 
          { 
           ph.RunDirection = PdfWriter.RUN_DIRECTION_RTL; // Right to Left 
           _table.AddCell(ph); 
          } 

         } 
         else if (btn != null) 
         { 
          ph = new PdfPCell(new Phrase(10, btn.Text, font)); 
          ph.Phrase.Clear(); // Clear the Cell Phrase 
          ph.Border = iTextSharp.text.Rectangle.NO_BORDER; 

          _table.AddCell(ph); 
         } 
         else if (hyperLink != null) 
         { 
          ph = new PdfPCell(new Phrase(10, hyperLink.Text, font)); 
          ph.Phrase.Clear(); //Clear the Cell Phrase 
          ph.Border = iTextSharp.text.Rectangle.NO_BORDER; 
          _table.AddCell(ph); 
         } 
         else 
         { 
          _table.AddCell("--"); 
         } 
        } 
        else 
        { 
         string s = gridViewReport.Rows[rowIteration].Cells[columnIteration].Text.Trim(); 
         PdfPCell ph = new PdfPCell(new Phrase(10, s, font)); 
         _table.AddCell(ph); 
        } 
       } 
      } 
      _table.CompleteRow(); 
     } 
     PdfWriter.GetInstance(document, Response.OutputStream); 
     // Opens the document. 
     document.Open(); 
     // Adds the _table to the document. 
     document.Add(_table); 
     // Closes the document. 
     document.Close(); 
     Page.Response.ContentType = "application/pdf"; 
     Page.Response.AddHeader("content-disposition", "attachment;filename=MyGrid.pdf"); 
     Page.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     Page.Response.Write(document); 
     Page.Response.End(); 

    } 

Este código podría no ser el perfectamente codificado pero espero que esto le ayudará a obtener los resultados requeridos.

+0

¿Qué versión de 'Dll' usaste? Porque no encontré el espacio de nombres o el ensamblado 'BaseColor' no se pudo encontrar ... –

+1

está en el espacio de nombres iTextSharp.text. Estoy usando itextsharp5.3.0 – MMK

+0

Muchas gracias :). Una pregunta más por favor, ¿es posible aplicar el 'css' en el GV impreso por' itextsharp' –

4

This GridView exporting library admite RTL. También puedes probar PdfReport biblioteca también.

+0

Ya uso esta biblioteca –

+0

Dice 'The no se pudo encontrar el tipo o el nombre del espacio de nombres 'color'. Estoy usando itextsharp versión 5.3 –

+0

Agregue una referencia al ensamblado System.Drawing. – VahidN