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.

Visual Basic – Leer y obtener datos de Excel

Recientemente, en una entrevista de trabajo, he tenido que realizar una prueba de conocimientos que consistía en acceder desde Visual Basic 2008 a una hoja de cálculo Excel, obtener los datos que contenía y luego generar un documento que imitaba el formato de una factura en PDF con los mismos.

Más allá de lo extraño que pareciese el planteamiento (para almacenar facturas lo normal es usar bases de datos, y además la hoja de cálculo no contenía todos los datos exigibles en una factura), me pareció que constituía un buen ejercicio para estrenar el apartado de Visual Basic en el blog.

Lo he dividido en dos partes: en la primera de ellas accederemos a la hoja de cálculo. En la segunda parte, publicada el 8 de agosto de 2014, nos encargamos de generar el documento PDF.

Así pues, sin más dilación, vayamos a por la primera parte.

Leer y obtener datos de una hoja Excel desde Visual Basic

Qué necesitaremos

Para este ejercicio necesitaremos lo siguiente en nuestro ordenador:

  • Sistema operativo Windows.
  • Una versión de Visual Studio. Yo uso 2013 Premium porque es la que tengo licenciada como estudiante.
  • Microsoft Excel 2007 o superior. En nuestro proyecto vamos a tener que echar mano de la Referencia “Microsoft Excel 14.0 Object Library”, que corresponde a la versión 2010, pero si tienes la versión 2007 deberías poder usar la referencia “Microsoft Excel 12.0 Object Library” obteniendo los mismos resultados. En internet he encontrado páginas que dicen cómo contar con estas librerías sin tener Excel instalado, pero a mí no me ha funcionado, así que me curo en salud y tiro por el camino de en medio: hace falta Excel 2007 o superior.
  • Una hoja de cálculo con los datos a obtener. En mi caso la he llamado “llistat_factures.xlsx” y contiene los siguientes datos:
    Los datos en sí dan igual, pero ten en cuenta que en mi ejemplo trato con el rango de celdas A1:J6. Rangos distintos provocarán errores en la ejecución del proyecto.
  • Para la siguiente entrega: Una imagen que hará las funciones de logotipo en nuestra factura PDF. La mía se llama “logo.png” y tiene unas dimensiones de 69×90 píxeles.
  • Para la siguiente entrega: Las librerías iTextSharp, que deberás descargar desde la página oficial. Estas librerías son las que nos permitirán generar nuevos PDFs desde nuestro código.

Añadir referencias al proyecto

En Visual Studio crearemos un nuevo proyecto de Visual Basic. Yo lo he llamado “xls2pdf”. Lo primero que vamos a hacer es añadir la referencia al proyecto que nos va a permitir manipular archivos Excel 2007+. Para ello, seguimos los siguientes pasos con nuestro proyecto abierto: (repito, uso Visual Basic 2013, en otras ediciones este procedimiento puede variar ligeramente):

  1. Menú “PROYECTO” – “Propiedades de xls2pdf”.
  2. En la parte izquierda de la ventana, pinchamos la pestaña “Referencias”.
  3. En la parte inferior, pinchamos en “Agregar.”
  4. Nos aparece la ventana “Administrador de referencias”. En la izquierda de la misma desplegamos la pestaña “COM” y seleccionamos “Biblioteca tipos”. En la parte principal de la ventana buscaremos la referencia “Microsoft Excel 14.0 Object Library”. Y hacemos doble click sobre ella para añadirla al proyecto. (También podemos situar el cursos sobre el espacio vacío a la izquierda del nombre para que aparezca la casilla de selección y marcarla). Por favor, ten en cuenta, que si tienes instalada una versión de Excel distinta a la 2010 esta referencia podría tener un número de versión distinto al 14.0.

El formulario

La idea es abrir la hoja Excel, cargar los datos de las facturas que se mostrarán en una lista, y al hacer doble click en un elemento de la lista generar el PDF correspondiente. Mi formulario es el siguiente. Además incluyo un botón para salir de la aplicación, y una etiqueta en la parte inferior a modo de barra de estado.

Es bastante sencillo y se explica por sí mismo:

Los controles que vamos a usar son los siguientes, con sus correspondientes nombres:

  • Formulario: frmPrincipal
  • Botones: btnCargar, btnLeer, btnSalir
  • Etiquetas: Label1 (“Resumen facturas”) y lblEstado.
  • Lista: lstFacturas.
  • OpenFileDialog: ofd
  • SaveFileDialog>: sfd

Importar referencia y variables globales

Primero importamos la referencia al objeto Excel. Hacemos doble click en una parte vacía del formulario. Justo encima de donde empieza la clase frmPrincipal tecleamos:

Justo por debajo de donde empieza la clase frmPrincipal añadirmos las variables y los arrays globales que almacenarán los datos de cada factura:

Botón Cargar

En el formulario, hacemos doble click sobre el botón btnCargar para programar su funcionamiento. Este botón simplemente mostrará el cuadro de diálogo para abrir el archivo .xlsx que nos interese. Cuando el usuario lo haya seleccionado, al hacer click en “Aceptar”, el archivo Excel quedará abierto y dispuesto para su manipulación. El código resultante será el siguiente:

Botón btnLeer

Una vez abierto el archivo .xlsx, al pulsar este botón leeremos su contenido, generaremos una línea resumen por cada factura y la añadiremos a la lista de facturas. Como siempre, para añadir el código correspondiente haremos doble clic sobre el botón en el formulario (btnLeer):

Botón btnSalir

Cuando el usuario haga clic en este botón, se le pedirá confirmación antes de abandonar la aplicación. El código para btnSalir es el siguiente:

Y por ahora basta…

Con lo dicho hasta ahora nuestro proyecto debería ser capaz de abrir un archivo .xlsx indicado por el usuario, generar un resumen por cada una de las filas contenidas en dicho archivo, y mostrar esos resúmenes en el cuadro de lista. En la próxima entrega seguiremos programando para que al hacer doble click en cualquier elemento de la lista se genere un PDF con la factura correspondiente.

Y con esto termina la primera parte. Como digo, en la siguiente entregatratamos exclusivamente la generación de los archivos PDF con la librería iTextSharp. Por favor, si encuentras errores o una manera más sencilla o elegante de conseguir esto, no dudes en hacérmelo saber. Mi entrevistador ya me dijo que había una (tal vez por eso no me han vuelto a llamar 😉 ).Ya sabes que yo también soy novato y siempre estoy ansioso por aprender 🙂

¡Muchas gracias por leerme!

Java – Ejercicio: Calcular letra NIF

Ejercicio clásico donde las haya, muy útil para practicar cuando se dan los primeros pasos en cualquier lenguaje de programación. En este caso, como ya habrás adivinado, lo vamos a realizar usando en Java. Con él veremos cómo recibir datos desde la consola y cómo llamar a funciones. Usaremos el operador módulo (%).

El algoritmo para calcular la letra del NIF

El algoritmo usado simplemente consiste en dividir el DNI (la parte numérica) entre 23. El resto obtenido será un entero que estará asociado a la letra que queremos obtener. Para calcular el resto de la división se usa el operador módulo (%).

La relación “resto – letra” es la siguiente:

Estructura del programa

En este ejemplo vamos a seguir la siguiente estructura:

  1. Escribir un método llamado calculaLetra que recibirá como parámetro un dni de tipo entero. Este método calculará el resto de dividir dni entre 23 y devolverá la letra correspondiente.
  2. Escribir un método llamado esEnteroPositivo que recibirá como parámetro una cadena. Intentará convertirla a entero. Si lo consigue, comprobará que sea mayor que 0, en cuyo caso devolverá true. En cualquier otro caso devolverá false.
  3. En el método main pediremos al usuario que introduzca un dni (sin letra) a través de la consola. Si el dni introducido es entero y positivo, calcularemos la letra correspondiente y la mostraremos por consola. En cualquier otro caso, mostraremos un mensaje indicándolo.

Código del programa

Puedes descargar el código desde mi cuenta en GitHub. Ya sabes que espero tus comentarios 🙂