Visual Basic – Generar archivo PDF desde código

Continuando con el post que inicié el pasado 1 de Agosto (“Visual Basic – Leer y obtener datos de Excel”), ahora voy a explicar cómo resolví el problema de generar la “pseudo-factura” en PDF que me exigían.

El resultado esperado debía ser algo similar al siguiente:

De los requisitos que especifiqué en el primer post, te recuerdo los que vamos a usar ahora:

  • Una imagen para el logo (“logo.png”, por ejemplo).
  • Librerías iTextSharp.

Pongámonos y manos a la obra.

Descargar y configurar iTextSharp en nuestro proyecto

  1. Descarga las librerías iTextSharp desde este enlace.
  2. Una vez descargado, extrae los siguientes archivos dentro de la carpeta de tu proyecto:
    • itextsharp.dll
    • itextsharp.pdfa.dll
    • iTextSharp.xml
    • itextsharp.xtra.dll

  3. Agregamos las referencias a iTextSharp a nuestro proyecto:
    • Menú “PROYECTO” – “Propiedades de xls2pdf”.
    • En la parte izquierda de la ventana, pinchamos la pestaña “Referencias”.
    • En la parte inferior, pinchamos en “Agregar.”
    • Con el botón “Examinar” buscamos dónde habíamos extraído los archivos anteriormente descargados y los agregamos como referencia.
  4. Importamos las referencias en nuestro proyecto. Con un doble click en cualquier parte vacía de nuestro formulario, justo encima de donde empieza la clase frmPrincipal teclearemos (la primera de las siguientes líneas ya deberías tenerla si seguiste la primera parte de este tutorial):

Generar el PDF

Recordemos cómo funcionaba nuestro formulario.

  1. Cargábamos el archivo Excel con el botón btnCargar.
  2. Leíamos el archivo Excel con el botón btnLeer. Con esto se rellenaba la lista de facturas.
  3. Haciendo doble click en una línea de la lista lstFacturas se generará un archivo PDF con el nombre que le indiquemos a través de un cuadro de diálogo.

El funcionamiento de los botones btnCargar y btnLeer (también btnSalir) ya lo programamos en la primera parte de este tutorial. Ahora pues corresponde codificar el evento de doble click sobre lstFacturas.

Doble click sobre un elemento de la lista lstFacturas

En nuestra ventana de código, copia las siguientes líneas (recuerda cambiar lstFacturas por el nombre que le hayas dado a tu lista):

Como vemos, el código anterior podría dividirse en 3 bloques:

  1. Líneas 02 a 30: obtenemos los datos de la factura seleccionada.
  2. Líneas 32 a 36: mostramos un mensaje con los detalles de la factura, pidiendo confirmación al usuario.
  3. A partir de la línea 37: si el usuario acepta, llamamos al método que efectivamente genera el PDF (concretamente la llamada se realiza en la línea 44).

El método generarPDF

Este método recibe como parámetros todos los detalles de la factura, como acabamos de ver en la mencionada línea 44 del código anterior. Es en este método dónde hacemos uso efectivo de las librerías iTextSharp. La idea para obtener un formato similar al de una factura, como se ve en la imagen al inicio de este post, es dividir el futuro PDF en una tabla. Trabajando con celdas resulta mucho más cómodo.

Así pues, copia el siguiente código en tu proyecto:

Aunque creo que con los comentarios incluidos en el propio código será suficiente, me gustaría destacar los siguientes puntos por ser específicos de las librerías iTextSharp:

Preparar el nuevo documento

  1. Línea 05: Declaramos un objeto tipo Document.
  2. Línea 06: Declaramos un objeto tipo PdfWriter, y le asignamos los datos del fichero PDF que deberá escribir.
  3. Línea 13: Una vez hemos preparado el nuevo documento, lo abrimos.
  4. Línea 110: Añadimos al documento todos los elementos con el método .Add(). En este ejemplo únicamente añadimos nuestra tabla (ya que ésta contiene a su vez todo lo que nos interesa).
  5. Línea 111: Cerramos el documento con el método .Close()

Imágenes

  1. Línea 04: Declaramos una variable tipo Image.
  2. Línea 10: A esta variable, mediante el método GetInstance le asignamos la ruta donde se halla la imagen en nuestro equipo.
  3. Línea 17: Definimos la celda que va a contener la imagen.

Tablas

  1. Línea 16: Definimos una nueva tabla, pasando como parámetro el número de columnas que va a contener (en nuestro caso 4).
  2. Líneas 57 a 107: A la tabla le vamos añadiendo celdas con el método .AddCell(). Este método puede recibir como parámetro un texto que se mostrará dentro de la celda, o bien un objeto Celda (pdfPCell) definido previamente.
  3. Línea 110: Recordar añadir el objeto tabla al documento.

Celdas

  1. Líneas 17 a 26: Definimos una nueva celda como “New PdfPCell()”. Como parámetros puede recibir cualquier tipo de objeto de iTextSharp (Image, Phrase, Paragraph…)
  2. Líneas 29 a 54: Asignamos los atributos de cada celda. Por ejemplo, en este ejemplo yo he definido las siguientes propiedades:
    • .Colspan: número de columnas que ocupará la celda (celdas combinadas).
    • .Padding: margen interior de la celda.
    • .Border: estilo del borde de la celda.
    • .HorizontalAlignment: tipo de alineación horizontal.
  3. Líneas 57 a 107: Como he dicho anteriormente, las celdas se añaden a la tabla mediante el método AddCell()

Al final ha resultado un post más extenso de lo que pensaba en un principio. Incluso puede que algo confuso. Por ello, pongo a tu disposición el código completo del proyecto en el siguiente repositorio de github: https://github.com/garciafigueres/xls2pdf.git

Además, aprovecho para recordarte que AQUÍ tienes una introducción muy básica del uso de repositorios git.

Como siempre, espero tus sugerencias, aportaciones, críticas…

Muchas gracias.