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(" ", ""), 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("á", "á").Replace("é", "é").Replace("í", "í").Replace("ó", "ó").Replace("ú", "ú");
}
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