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
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.
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
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
- 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();
Process prc = new System.Diagnostics.Process(); prc.StartInfo.FileName = fileName; prc.Start();
Me quedó así:

Una pedorrada, pero tenemos nuestro reporte
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)

