sábado, 9 de agosto de 2014

Creacion de PDF apartir de un GridView

Hoy les traigo otra ayuda de ITextsharp ^^. Manos a la obra.

Me vi en la necesidad de crear un reporte en itextsharp desde una grid, hubiera sido fácil renderizar y enviarlo al pdf, pero debido a la información se dividía en dos partes la hoja y no la podia personalizar, por lo cual tuve que hacerlo de forma manual con ITextSharp, para lo cual cree una clase que lo realiza, la cual les comparto dos metodos a continuacion.

Nota: Lo menejo en clases por que se pudiera volver a ocupar en otros lados del proyecto o en otros proyectos.


Retomando mi post Anterior Crear reporte con ItextSharp en C# con tabla, utilizare la clase TablaPDF que tiene mi metodo celda para el llenado de las celdas de la tabla y tenemos lo siguiente:
//Esta es el metodo que realiza el trabajo, los parámetros los pueden manejar a su gusto, el primero si es importante
    /// <summary>
    ///Clase para crear un PDF apartir de un grid
    /// </summary>
    /// <param name="gv">Parámetro importante, ya que a partir de este se realiza la creación del PDF</param>
    /// <param name="titulo"></param>
    /// <param name="fechacorte"></param>
    /// <returns></returns>
    public string GridToPdf(GridView gv, string titulo, string fechacorte)
    {
        //Creación de documento, como ya se ha visto en post anteriores
        string ruta = "";

        Document doc = new Document(iTextSharp.text.PageSize.A4.Rotate());
        doc.AddAuthor("GUstavo Ortiz Gamez");
        doc.AddKeywords("pdf, PdfWriter; Documento; iTextSharp");
        doc.SetMargins(40.0f, 100.0f, 30.0f, 10f);
        ruta = HttpContext.Current.Server.MapPath(@"~\" + "GridToPDF.pdf");
        PdfWriter wri = null;
        wri = PdfWriter.GetInstance(doc, new FileStream(ruta, FileMode.Create));

        doc.Open();
        //Esta clase es donde guardo  mis metodos para crear las celdas.
        TablaPDF tp = new TablaPDF();
        iTextSharp.text.Rectangle page = doc.PageSize;

        //Se obtiene el total de columnas del grid del row 0 que vendrían siendo las columnas
        int totalc = gv.Rows[0].Cells.Count;
        //Creación de la tabla, solo que aquí le pasamos el total previamente obtenido
        PdfPTable table = new PdfPTable(totalc);
        table.WidthPercentage = 100;
        table.TotalWidth = page.Width - 95;
        table.LockedWidth = true;
        table.HorizontalAlignment = 0;
        //Ocupo dos tablas por el encabezado, pero es a su gusto
        PdfPTable table1 = new PdfPTable(3);
        table1.WidthPercentage = 100;
        table1.TotalWidth = page.Width - 95;
        table1.LockedWidth = true;
        table1.HorizontalAlignment = 0;

        #region titulodocumento
        //Aquí envió una imagen, eso lo puedes agregar en la clase previamente compartida y hacen una sobrecarga del método para que mapee la imagen  en vez de texto con iTextSharp.text.Image en vez de paragraph: 
        //iTextSharp.text.Image imagen = iTextSharp.text.Image.GetInstance("Ruta Imagen");
        //PdfPCell header = new PdfPCell(imagen, false);

        string rutai = HttpContext.Current.Server.MapPath(@"~\" + @"themes\default\images\reportes\logotipopiasahorizontal.jpg");
        table1.AddCell(tp.celdaimg(rutai, 3, 3, 1, 0, 348, 80));
        table1.AddCell(tp.celda("\n", 8, 2, 6, 1, 0));
        table1.AddCell(tp.celdanegrita(titulo, 3, 1, 14, 1, 0, "White", BaseColor.BLACK));
        table1.AddCell(tp.celda("\n", 8, 2, 6, 1, 0));

        table1.AddCell(tp.celdanegrita(fechacorte, 3, 1, 14, 1, 0, "White", BaseColor.BLACK));
        doc.Add(table1);

        doc.Add(new Paragraph("\n"));

        #endregion

        #region contenido


        //cabecera del grid
        for (int i = 0; i < totalc; i++)
        {
            //Con esta línea obtengo la cabecera de mi grid, para esto deben de configurar su grid como lo vallan a utilizar
            //Utilizo un método para limpiar unos caracteres que al momento de extraer de mi grid los pone con código ascii
            table.AddCell(tp.celdanegrita(LimpiaTexto(gv.HeaderRow.Cells[i].Text), 1, 1, 8, (i == 0 ? 0 : 1), 13, "#F29401", BaseColor.WHITE));
        }
        //contenido del grid
        int cstyle = 1;
        int bnd = 0;
        //Empezamos a recorrer el grid para obtener los rows
        foreach (GridViewRow row in gv.Rows)
        {

            //Este código es para ir entrelazando los colores de cada row,
            string color = "";
            if (cstyle == 0)
            {
                color = "white";
                cstyle = 1;
            }
            else
            {
                cstyle = 0;
                color = "#EFEFEF";
            }
            //Por cada row sacamos las celdas y vamos construyendo nuestra tabla pdf
            for (int i = 0; i < row.Cells.Count; i++)
            {
                //Este es un método sobrecargado de acuerdo a mis requerimientos y lo maneje en una clase
                table.AddCell(tp.celda(row.Cells[i].Text.Replace("&nbsp;", ""), 1, 1, 8, 1, 14, color, BaseColor.WHITE));
            }
        }
        //Este parte es por si necesitan cerrar su tabla con algún pie de página o si tu grid tiene footer.
        if (bnd == 0)
        {
            //pie
            for (int i = 0; i < totalc; i++)
            {

                table.AddCell(tp.celda(" ", 1, 1, 8, (i == 0 ? 0 : 1), 14, "#F29401", BaseColor.WHITE));
            }
        }


        doc.Add(table);
        #endregion
        doc.Close();

        return ruta;
    }

/// <summary>
    /// Metodo para limpiar los códigos ASCII
    /// </summary>
    /// <param name="texto">Texto a Limpiar </param>
    /// <returns> Regresa el texto con el carácter correspondiente</returns>
    public string LimpiaTexto(string texto)
    {
        return texto.Replace("&#225;", "á").Replace("&#233;", "é").Replace("&#237;", "í").Replace("&#243;", "ó").Replace("&#250;", "ú");
    }

Ya con esto si lo manejamos en una clase solo la instanciamos o bien si la vuelven estatica solo la invocan y el gridview lo asignan ya sea de BD, de una lista, de una tabla o del proveedor de datos que elijan.

No olviden hacer lo siguiente en su Grid

Grid.DataSource= Datos;
Grid.DataBind();

Espero les sea util y ya saben cualquier duda, estoy a sus atencion.

Saludos Cordiales!

No hay comentarios:

Publicar un comentario