Generar documentos, informes y facturas en formato PDF con JasperReports y Java

Escrito por picodotdev el .
java planeta-codigo
Enlace permanente Comentarios

Para generar documentos PDF sencillos en Java está la librería PDFBox que mediante código permite insertar la información y los elementos del documento. Con PDFBox el documento es generado completamente mediante código, para separar el estilo del documento y la información que contiene y para documentos más complejos está JasperReports que mediante una plantilla hace que si cambia el estilo del documento el código no requiera cambios.

Las aplicaciones en el ámbito de gestión necesitan generar documentos a partir de la información que contienen. Pueden ser para exportar datos en un archivo en formato CSV con Apache POI o documentos PDF sencillos con PDFBox. Los documentos PDF pueden ser de diverso tipo, informes, facturas, cartas, recibos, … En Java una de las librerías para generar documentos PDF complejos es JasperReports.

Los informes de JasperReports se generan a partir de una plantilla creada con JasperReport Studio. JasperReports divide un documento en diferentes bandas en las cuales se puede incluir diferentes elementos como texto, valores, imágenes, … Las bandas son apartados de información como la cabeceras o detalles, puede estar anidadas y repetirse según los datos de la fuente de datos.

JasperSoft Studio

Los informes con JasperReports tiene varias posibilidades de obtener los datos, una de ellas es proporcionándoselos mediante parámetros y o una colección de beans de cualquier tipo, pero también proporcionándole una conexión a la base de datos relacional y que JasperReports lance consultas SQL para obtener los datos que necesita.

Utilizando los elementos de la paleta como campos de texto e imagen y posicionándolos en el lugar adecuado sobre el informe se crea la plantilla del documento. Para asignar valores a los elementos se inserta una expresión que en este caso permite obtenerlo de los parámetros que se le proporcionen al informe a los cuales con funciones incorporadas se les puede aplicar transformaciones para obtener el valor deseado (de fecha, lógicas, numéricas o de texto).

Editor de expresiones

El código Java necesario para compilar el archivo de la plantilla del informe, proporcionarle los parámetros y generar el PDF es el siguiente.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package io.github.picodotdev.blogbitix.jasperreports;

import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

...

public class Main {

    public static void main(String[] args) throws Exception {
        Map<String, Object> parameters = new HashMap<String, Object>();

        Factura factura = new Factura("Compañía S.A.", "picodotdev", "Factura enero 2019", "100000", "00011111111", new BigDecimal("25.00"), "1111111",
            "picodotdev", "BASKESXXXX", "ES24-0000-0000-0000-0000-0000", LocalDateTime.now(), LocalDateTime.now());

        List<Factura> facturas = Arrays.asList(factura);

        InputStream is = Main.class.getResourceAsStream("factura.jrxml");
        JasperReport report = JasperCompileManager.compileReport(is);

        JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(facturas);

        JasperPrint print = JasperFillManager.fillReport(report, parameters, dataSource);

        JasperExportManager.exportReportToPdfFile(print, "factura.pdf");
    }
}
Main.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
plugins {
    id 'java'
    id 'application'
}

application {
    mainClassName = 'io.github.picodotdev.blogbitix.jasperreports.Main'
}

dependencies {
    implementation 'net.sf.jasperreports:jasperreports:6.11.0'
    implementation 'com.lowagie:itext:2.1.7'
}

repositories {
    mavenCentral()
}
build.gradle

El resultado es este boceto de factura a la que con más tiempo, añadiendo más elementos y modificando los estilos quedará algo más real a lo que son las facturas emitidas por las compañías.

Documento PDF generado con JasperReports

En este caso los datos solo se proporcionan mediante parámetros pero JasperReport también es capaz de extraer los datos realizando consultas en a la bases de datos directamente usando una conexión de JDBC y las sentencias SQL adecuadas. En algún caso también es posible insertar en el documento una gráfica generada con JFreeChart previamente, al informe como parámetros se le puede enviar cualquier tipo de Java que para una gráfica es un InputStream.

Los siguientes enlaces son documentación a una guía de inicio, una guía completa y tutoriales.

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando siguiente comando:
./gradlew run

Comparte el artículo: