Categoría: Dev

Simplificando Apache PDFBox: Introducción a GridBoxPDF

Cuando hablamos de generar documentos PDF desde Java, una de las herramientas que podemos utilizar es Apache PDFBox, una libreria de código abierto que nos permite crear, modificar y trabajar con documentos PDF.

Sin embargo, aunque PDFBox es una herramienta increíblemente potente y robusta y ofrece muchas posibilidades, trabajar directamente con ella implica controlar aspectos como las coordenadas, la posición del texto y los saltos de línea. Es decir, hacer tareas tan simples como escribir un párrafo requiere calcular coordenadas X e Y a mano, manejar el flujo de la página y controlar manualmente los saltos de línea.

Precisamente de esa necesidad surge GridBoxPDF, una biblioteca que he desarrollado utilizando Apache PDFBox como base, con la idea de simplificar algunas de las tareas más comunes al generar documentos PDF.

¿Qué es GridBoxPDF?

GridBoxPDF es una biblioteca para Java que proporciona una capa de abstracción sobre Apache PDFBox. Su objetivo es facilitar la creación de documentos mediante métodos que permiten agregar texto, trabajar con celdas, configurar fuentes y controlar la distribución del contenido en las páginas.

La idea es sencilla: en lugar de gestionar manualmente todos los detalles de posicionamiento para cada elemento, podemos utilizar métodos que nos permitan concentrarnos más en el contenido que queremos generar.

Por ejemplo, GridBoxPDF cuenta con métodos como addPage(), cell() y multiCell(), que permiten agregar páginas, escribir texto en celdas y trabajar con párrafos que pueden ocupar varias líneas.

También incluye opciones para configurar fuentes, colores, márgenes, saltos de página, encabezados, pies de página y tablas.

Instalación

GridBoxPDF está desarrollado para Java 21 y utiliza Apache PDFBox para la generación de documentos PDF.

El artefacto está disponible en Maven Central, puedes agregar la siguiente dependencia a tu archivo pom.xml:

<dependency>
    <groupId>com.rgmelendez</groupId>
    <artifactId>gridboxpdf</artifactId>
    <version>1.0.3</version>
</dependency>

Una vez agregada la dependencia, podrás utilizar la biblioteca desde tu aplicación Java.

Nuestro primer PDF

Para comenzar a utilizar GridBoxPDF, vamos a generar un documento PDF sencillo que contenga un texto. El siguiente ejemplo muestra cómo crear una página, agregar contenido y guardar el archivo.

import com.rgmelendez.GridBoxPDF;

public class Main {

    public static void main(String[] args) {
        GridBoxPDF pdf = new GridBoxPDF();

        pdf.addPage();

        pdf.cell("Hello GridBoxPDF!", 0, "L");

        pdf.close("hello.pdf");

        System.out.println("PDF generated successfully!");
    }
}

Como podemos ver, el código es bastante sencillo. Creamos una instancia de GridBoxPDF, agregamos una página, insertamos el texto y guardamos el documento.

El archivo hello.pdf se genera en la ruta indicada, relativa al directorio de trabajo de la aplicación. En este ejemplo, el texto se alinea a la izquierda y la biblioteca utiliza sus valores predeterminados para la configuración del documento.

¿Por qué desarrollar otra biblioteca?

Apache PDFBox es una herramienta bastante completa y no se trata de reemplazarla. La intención de GridBoxPDF es ofrecer una forma diferente de trabajar con ella, especialmente cuando necesitamos generar documentos desde una aplicación Java y queremos reducir parte del código necesario para organizar su contenido.

En muchas ocasiones, al desarrollar aplicaciones, necesitamos generar reportes, documentos o archivos que contienen información organizada en filas, columnas y párrafos. Contar con métodos que faciliten estas tareas puede hacer que el código sea más sencillo de escribir y mantener.

Ese es el enfoque que he buscado darle a GridBoxPDF: proporcionar una API sencilla para algunas de las operaciones habituales al generar documentos PDF, sin perder de vista las capacidades que ofrece Apache PDFBox.

Un proyecto de código abierto

GridBoxPDF está disponible como proyecto de código abierto bajo la licencia Apache 2.0. Esto permite que otros desarrolladores puedan conocer su funcionamiento, utilizarlo, modificarlo y distribuirlo de acuerdo con las condiciones de la licencia.

El repositorio incluye ejemplos que muestran cómo utilizar las principales características de la biblioteca, desde la generación de un documento sencillo hasta el manejo de fuentes, tablas y saltos de página.

Si trabajas con Java y necesitas generar documentos PDF, te invito a conocer el proyecto y revisar los ejemplos disponibles.

Puedes consultar el código fuente, la documentación y las instrucciones de instalación en el siguiente enlace:

GridBoxPDF en GitHub

¿Qué sigue?

Este artículo es el punto de partida para conocer GridBoxPDF y el objetivo detrás de su desarrollo. En las siguientes publicaciones compartiré más detalles sobre su uso, las funcionalidades disponibles y algunos ejemplos prácticos de generación de documentos PDF con Java.

La idea es ir explorando la biblioteca paso a paso, desde la creación de un documento sencillo hasta funciones más específicas, como el manejo de fuentes, tablas, encabezados, pies de página y saltos de página.

Este es el inicio de un proyecto que espero seguir mejorando con nuevas funcionalidades y con la experiencia que surja de su uso.

Conectando cliente IMAP con Office365

En días recientes he estado trabajando en la configuración de una aplicación para realizar la lectura de cuentas de correo con el objetivo de obtener información que debe ser procesada de manera automática, colocando en la vista del usuario sólo la información que es importante.

Si bien, no es la primera vez que realizo está configuración si es la primera vez que no conseguí que la aplicación funcionara como debería. En los logs de la aplicación sólo obtenía el siguiente mensaje:

A3 BAD User is authenticated but not connected

Busqué por internet por este código de error, y parecía que sería algo fácil de solucionar, varios blogs te daban algunas sugerencias de como se podría solventar, sin embargo no fue así, probe cada una de las alternativas que te daban pero ninguna de ellas me daban la solución.

Habilité el modo debug en la aplicación y empece a seguir la trazabilidad de los mensajes, y era claro, estaba haciendo el login de forma correcta (varios logs hacen referencia que podría ser por un problema de user y password) sin embargo seguía obteniendo el mismo error una y otra vez.

Probé habilitando las opciones de seguridad TLS y SSL, pruebas con distintos puertos y el resultado era el mismo.

Después de varios días de investigación y pruebas, y de convencer al cliente que hiciéramos una revisión conjunta del servidor de correo Office365 logré ver que el problema es porque el usuario de correo tenía deshabilitada la opción para conexión por IMAP.

Creo que pude haber comenzado por ahí, pero debido a que en todo momento lograba obtener un mensaje de autenticación correcta no es algo que se me hubiera ocurrido. No sé si un bug en el servidor Office365 o es una funcionalidad, pero creo que si un usuario no tiene la opción para la conexión, ya sea IMAP o POP3, no debería darte un mensaje de conexión exitosa.

Pero bueno, si están trabajando con IMAP y Office 365, y logran hacer el login pero no obtener mensajes o les regresa el mensaje de error “A3 BAD User is authenticated but not connected“, podrían empezar por revisar si el usuario tiene habilitada esa conexión ;).

P.D. Intenté hacer la conexión mediante el cliente de correo Thunderbird y sucede lo mismo, establece la autenticación de manera exitosa, y parece que la cuenta ya está bien configurada, pero no puede realizar la conexión con el servidor para descargar los correos de entrada.