Hace tiempo programando me encontré con un problema: Necesitaba hacer un reporte en pdf pero a partir de uno existente con campos que tenían que completarse de acuerdo a la información mandada desde el software.

Así fue me tope con ITextSharp, una librería para .NET (Basada en IText de Java) completamente opensource, que aparte de solucionarme esa dificultad resulto una excelente manera para hacer todos los reportes que necesitaba.

Acá voy a mostrarles como hacer un reporte básico en PDF, y quizá más adelante en otro post me extienda en explicar como resolver el problema que tuve yo en particular :mrgreen:

Instalando ITextSharp

Lo que voy a mostrar es como realizar un reporte básico con texto, alguna imágen y una tabla. El código mostrado esta en C# y fué probado utilizando el Framework 4.0.

Lamentablemente no encontré mucha documentación oficial, pero con una búsqueda en Google encontrarán que se pueden hacer cientos de cosas más ;)

Para empezar, basta con bajarse la última versión de su sitio web, descomprimirla, y agregar la referencia correspondiente a nuestro proyecto de .NET.

Para esto sobre nuestro proyecto hacemos botón derecho y vamos a “Agregar referencia” (puede tardar un poco en cargar). Luego vamos a “Examinar”, buscamos el archivo “itextsharp.dll” que descomprimimos y aceptamos.

Ahora que tenemos la referencia física, hay que agregar la referencia lógica en los archivos donde vayamos a usar las funciones que nos proveé.

using iTextSharp;
using iTextSharp.text;
using iTextSharp.text.pdf;

Para este ejemplo aparte voy a usar dos más:

using System.IO;
using System.Diagnostics;

Generando el documento

Lo primero es crear un documento y abrirlo, lo hacemos así

string fileName = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".pdf";
Document document = new Document(PageSize.A4, 50, 50, 25, 25);
PdfWriter.GetInstance(document, new FileStream(fileName, FileMode.Create));
document.Open();
  • El filename es la ruta donde vamos a dejar el archivo, podría ser algo más simple como “C:/Users/….” en este casó con GetTempPath tome la carpeta temporal del sistema, y con el NewGuid un valor aleatorio. Luego le agregue “.pdf” al final, y con eso guardo el archivo generado en temporales y con cualquier nombre ;)
  • Creo una nueva instancia de Document, y le paso como primer parametro el tamaño de la hoja, y los margenes
  • Obtuve una instancia de un PdfWriter, le pase el documento, y al lado un FileStream con la ruta y el modo en que va a abrir nuestro archivo Pdf
  • Abrí el documento para escribirlo.
La metodología para generar el documento es siempre la misma: Generar un objeto, darle propiedades y agregar el objeto al documento.

Agregando parrafos

Paragraph parrafo = new Paragraph();
 
parrafo.Alignment = Element.ALIGN_CENTER;
parrafo.Font = FontFactory.GetFont("Arial", 24);
parrafo.Font.SetStyle(Font.BOLD);
parrafo.Font.SetStyle(Font.UNDERLINE);
 
parrafo.Add("It's cool man, she's 18");

Y es importante no olvidarse de agregar este parrafo al documento:

document.add(parrafo);

Si quieren pueden no darle formato quitando desde el Alignment hasta el ultimo parrafo.Font ;)

Agregando imágenes

Para este caso voy a mostrar como agregar una imágen, pero desde un archivo de recursos: Esto nos da la ventaja que nuestra imágen viaja siempre dentro de nuestra aplicación ;)

Si no tenemos un archivo de recursos, botón derecho sobre el proyecto, agregar, archivo de recursos, aceptar, y ahora agregamos nuestra imágen:

Una vez que tenemos la imágen agregada vamos al código

byte[] bytesImagen =
    new System.Drawing.ImageConverter().ConvertTo(Recursos.cat, typeof(byte[])) as byte[];
Image imagen = Image.GetInstance(bytesImagen);
imagen.Alignment = Element.ALIGN_CENTER;
document.add(image);

Como pueden ver

  • Lo primero es obtener los bytes de nuestra imágen, y es lo que hacemos con la primer linea.
  • En el primer parámetro de ConvertTo esta especificado cual es el recurso a convertir (En este caso Recursos.cat)
  • Luego obtenemos una instancia de Image y le pasamos los bytes que obtuvimos
  • Y al igual que hicimos con el  párrafo, agregamos la imágen al documento

Agregando tablas

Es posible agregar tablas, es un poco más largo que todo lo anterior, pero nada de otro mundo:

PdfPTable unaTabla = new PdfPTable(2);
unaTabla.SetWidthPercentage(new float[] { 300, 300}, PageSize.A4);
 
//Headers
unaTabla.AddCell(new Paragraph("Columna 1"));
unaTabla.AddCell(new Paragraph("Columna 2"));
 
//¿Le damos un poco de formato?
foreach (PdfPCell celda in unaTabla.Rows[0].GetCells()){
                celda.BackgroundColor = BaseColor.LIGHT_GRAY;
                celda.HorizontalAlignment = 1;
                celda.Padding = 3;
}
 
PdfPCell celda1 = new PdfPCell(new Paragraph("Celda 1", FontFactory.GetFont("Arial", 10)));
PdfPCell celda2 = new PdfPCell(new Paragraph("Celda 2", FontFactory.GetFont("Arial", 10)));
PdfPCell celda3 = new PdfPCell(new Paragraph("Celda 3", FontFactory.GetFont("Arial", 10)));
PdfPCell celda4 = new PdfPCell(new Paragraph("Celda 4", FontFactory.GetFont("Arial", 10)));
 
unaTabla.AddCell(celda1);
unaTabla.AddCell(celda2);
unaTabla.AddCell(celda3);
unaTabla.AddCell(celda4);
 
document.add(unaTabla);

Entendiendo un poco de ingles es todo deducible :mrgreen:

Algunas aclaraciones:

  • Al instanciar PdfPTable lo que le estamos pasando es la cantidad de columnas
  • Con SetWidthPorcentaje le estamos dando el ancho a cada columna
  • La parte de formato es decorativa, se puede quitar y el código seguiria andando igual :mrgreen:
  • No hay que olvidarse de agregar todas las celdas a la tabla y como siempre la tabla al documento
  • Si seguimos agregando celdas, supongamos agregamos celda 5 y celda 6, automáticamente se nos va a agregar la fila.

Terminar y lanzar el PDF

Una vez que hayamos terminado de editar el documento, hay que cerrarlo con un método complejísimo: close.

document.close();
Y para lanzarlo vamos a hacer uso de Process (Que esta en System.Diagnostics)
Process prc = new System.Diagnostics.Process();
prc.StartInfo.FileName = fileName;
prc.Start();

Me quedó así:

Una pedorrada, pero tenemos nuestro reporte :mrgreen:

Acá les dejo el código para que les sirva como base, modifiquenlo a gusto.

Les recuerdo que esta en C# y usando el Framework 4.0. (No lo probé con el 3.5 y menos con el 2.0)

Descargar Ejemplo

Etiquetas: , , , , ,

11 Comentarios


  1. […] Fuente: imcosta.net […]

  2. Oscar Hugo Cardenas Lopez on 05 feb 2013

    Excelente aporte cuenta con todo lo básico necesario para cualquier reporte y evita una instalación tan grande.

  3. ornella on 06 mar 2013

    Muy bueno gracias por el aporte es el mas completito que encontre…

  4. yoana on 08 mar 2013

    esta mierda no sirve

  5. victor on 03 abr 2013

    hola gracias por postear este articulo es muy bueno, una pregunta.
    Sabes si tiene limite de creacion de pdfs, y si tiene algun costo la licencia

  6. Jesus on 01 oct 2013

    Felicitaciones al autor!

    Simple, didactico y funcional. Muy bueno. Gracias!

    Saludos.

  7. agot pier on 24 oct 2013

    Y si una tabla o dato ya no cabe en la hoja se pasa a la siguiente??? como se controla eso.

  8. Jose Pablo on 02 abr 2014

    Hola.
    Me parece muy interesante poder usar esto como alternativa al crystal report, mi pregunta es si tambien se puede exportar a word y exel con esto?

  9. JAVO on 02 abr 2014

    que buen ejemplo

  10. Lorena Espinoza Cuevas on 10 sep 2014

    Hola. me ha servido mucho tu ejemplo. Tu sabras como identificar cuanto espacio resta de una página. Por ejemplo la tabla que creaste si no cabe con todo y “su encabezado” quiero dar el salto y que se imprima en la siguiente pagina. algo asi.

    Yo tengo un proceso que imprime varias tablas, imagina que quiero imprimir un examen en la que tengo secciones, preguntas y las respuestas. las estructura de mi tabla es algo asi:

    Row 0 — Descripcion de la sección
    Row 1 –> Preguntas
    Row 2 –> Respuestas
    Row 3 –> Preguntas
    Row 4 –> Respuestas

    cada tabla puede tener X renglones, entonces el tamaño de la tabla o el alto de la tabla es muy variable. y lo que quiero es saber si en la pagina donde estoy imprimiendo o agregando esta tabla caben la tabla o minimo quisiera poder conservar el renglon “Pregunta” con su Renglon “Respuesta”.

    Saludos, ojala me puedan dar ideas muchas gracias.

  11. Carlos on 07 jul 2015

    Hola gracias por el articulo, muy bueno. una pregunta, como hago para insertar una imagen a un archivo pdf ya creado? agradezco la ayuda.


Deja tu comentario