Introducción
En este rápido artículo, nos centraremos en la creación de un documento PDF desde cero basado en la popular biblioteca iText y PdfBox.
Dependencias de Maven
Echemos un vistazo a las dependencias de Maven, que es necesario incluir en nuestro proyecto:
La última versión de las librerías se puede encontrar aquí: iText y PdfBox.
Es necesario añadir una dependencia extra, en caso de que nuestro archivo necesite ser encriptado. El paquete Bounty Castle Provider contiene implementaciones de algoritmos criptográficos y es requerido por ambas bibliotecas:
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.56</version></dependency>
La última versión de la biblioteca se puede encontrar aquí: The Bounty Castle Provider.
Overview
Tanto iText como PdfBox son bibliotecas java utilizadas para la creación/manipulación de archivos pdf. Aunque el resultado final de las bibliotecas es el mismo, operan de manera un poco diferente. Vamos a echarles un vistazo.
Crear Pdf en IText
4.1. Insertar texto en Pdf
Vamos a ver cómo se inserta un nuevo archivo con el texto «Hola Mundo» en un archivo pdf
Crear un pdf con un uso de la librería iText se basa en manipular objetos que implementan la interfaz Elements en Document (en la versión 5.5.10 hay 45 de esas implementaciones).
El elemento más pequeño que se puede añadir al documento y utilizar se llama Chunk, que es básicamente una cadena con una fuente aplicada.
Además, los Chunk’s se pueden combinar con otros elementos como Paragraphs, Section, etc. dando como resultado documentos de aspecto agradable.
4.2. Inserción de imágenes
La librería iText proporciona una forma sencilla de añadir una imagen al documento. Simplemente tenemos que crear una instancia de Imagen y añadirla al Documento.
4.3. Insertar una tabla
Puede que nos encontremos con un problema cuando queramos añadir una tabla a nuestro pdf. Por suerte, iText proporciona una funcionalidad de este tipo.
Lo primero que tenemos que hacer es crear un objeto PdfTable y en el constructor proporcionar un número de columnas para nuestra tabla. Ahora podemos simplemente añadir una nueva celda llamando
Ahora podemos simplemente añadir una nueva celda llamando al método addCell en el objeto de tabla recién creado. iText creará las filas de la tabla siempre y cuando se definan todas las celdas necesarias, lo que significa que una vez que se crea una tabla con 3 columnas y se le añaden 8 celdas, sólo se mostrarán 2 filas con 3 celdas en cada una.
Vamos a ver el ejemplo:
Creamos una nueva tabla con 3 columnas y 3 filas. La primera fila la trataremos como una cabecera de tabla con un color de fondo y un ancho de borde cambiados:
La segunda fila estará compuesta por tres celdas sólo con texto, sin formato extra.
private void addRows(PdfPTable table) { table.addCell("row 1, col 1"); table.addCell("row 1, col 2"); table.addCell("row 1, col 3");}
Podemos incluir no sólo texto en las celdas sino también imágenes. Además, cada celda podría ser formateada individualmente, en el ejemplo presentado a continuación aplicamos ajustes de alineación horizontal y vertical:
4.4. Codificación de archivos
Para aplicar el permiso usando la biblioteca iText, necesitamos tener un documento pdf ya creado. En nuestro ejemplo, utilizaremos nuestro archivo iTextHelloWorld.pdf generado anteriormente.
Una vez que cargamos el archivo utilizando PdfReader, necesitamos crear un PdfStamper que se utiliza para aplicar contenido adicional al archivo como metadatos, cifrado, etc:
En nuestro ejemplo, ciframos el archivo con dos contraseñas. La contraseña de usuario («userpass») donde un usuario sólo tiene derecho de lectura sin posibilidad de imprimirlo, y la contraseña de propietario («ownerpass») que se utiliza como clave maestra que permite a una persona tener acceso completo al pdf.
Si queremos permitir al usuario imprimir el pdf, en lugar de 0 (tercer parámetro de setEncryption) podemos pasar:
PdfWriter.ALLOW_PRINTING
Por supuesto, podemos mezclar diferentes permisos como:
PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY
Tenga en cuenta que al usar iText para establecer los permisos de acceso, también estamos creando un pdf temporal que debe ser eliminado y si no podría ser totalmente accesible para cualquiera.
Crear Pdf en PdfBox
5.1. Insertar texto en Pdf
A diferencia de iText, la librería PdfBox proporciona una API basada en la manipulación de flujos. No hay clases como Chunk/Paragraph, etc. La clase PDDocument es una representación Pdf en memoria donde el usuario escribe datos manipulando la clase PDPageContentStream.
Veamos el ejemplo de código:
5.2. Insertar una imagen
Insertar imágenes es sencillo.
Primero tenemos que cargar un archivo y crear un PDImageXObject, posteriormente dibujarlo en el documento (hay que proporcionar las coordenadas x,y exactas).
Eso es todo:
5.3. Insertar una tabla
Desgraciadamente, PdfBox no proporciona ningún método out-of-box que permita crear tablas. Lo que podemos hacer en tal situación es dibujarla manualmente – literalmente, dibujar cada línea hasta que nuestro dibujo se asemeje a nuestra tabla soñada.
5.4. Encriptación de archivos
La biblioteca PdfBox ofrece la posibilidad de encriptar, y ajustar los permisos de los archivos para el usuario. En comparación con iText, no requiere utilizar un archivo ya existente, ya que simplemente utilizamos PDDocument. Los permisos de los archivos Pdf son manejados por la clase AccessPermission, donde podemos establecer si un usuario podrá modificar, extraer el contenido o imprimir un archivo.
Posteriormente, creamos un objeto StandardProtectionPolicy que añade protección basada en contraseña al documento. Podemos especificar dos tipos de contraseña. La contraseña de usuario, después de lo cual la persona será capaz de abrir un archivo con los permisos de acceso aplicados y la contraseña de propietario (sin limitaciones al archivo):
Nuestro ejemplo presenta una situación que si un usuario proporciona la contraseña de usuario, el archivo no puede ser modificado e impreso.
Conclusiones
En este tutorial, hemos discutido las formas de crear un archivo pdf en dos bibliotecas Java populares.
Los ejemplos completos se pueden encontrar en el proyecto basado en Maven sobre en GitHub.
Inicie con Spring 5 y Spring Boot 2, a través del curso Learn Spring:
>> CONSULTE EL CURSO