Añadir Imagen en Jasper Report

De ChuWiki


Jasper Report permite añadir imágenes en los informes de muchas formas, vamos a ver aquí algunas de ellas.

Aunque explicaremos los detalles, partimos de que conoces Jaspersoft Studio y partimos del informe generado en el tutorial de Jasper Studio. Puedes revisarlo si lo que se explica aquí te suena raro.

Añadir imagen de un fichero en Jasper Report[editar]

Para añadir una imagen en nuestro informe, arrastramos el componente "Image" desde la pestaña "Palette" de Jaspersoft Studio sobre nuestro informe. Nos aparecerá una ventana como la siguiente

Añadir una imagen en Jasper Studio
Añadir una imagen en Jasper Studio

En este caso queremos una imagen de fichero, así que seleccionamos la opcion "Worksapce Resource" o "Absolute Path".

  • Workspace Resource. Para poder seleccionar esta opción, tenemos que tener cargada la imagen en nuestro proyecto Jaspersoft Studio, pestaña "Project Explorer". Te bastará arrastrar la imagen donde la tengas en tu disco sobre el nombre de tu proyecto en dicha pestaña "Project Explorer". Esta opción obliga a que cuando generemos el informe, la imagen esté en el path relativo en el que esté la imagen dentro de tu proyecto.
  • Absolute Path. Un path absoluto en tu disco. Esta opción no está recomendada porque si llevamos el fichero de informe a otro ordenador para generarlo, tendremos que crear ese path absoluto y copiar la imagen en el nuevo ordenador.

En nuestro caso, he metido la imagen dentro del path "src/main/files" del proyecto Jaspersoft Studio. He seleccioado "Workspace Resource".

Añadir una imagen al Workspace de Jasper Studio
Añadir una imagen al Workspace de Jasper Studio

Al pulsar el botón "Browse" te aparecerá un listado de imágenes en el proyecto. Selecciono la que tengo y tendrás la imagen con la vista preliminar de dicha imagen. Pulsando el botón Ok, aparecerá la imagen en el informe y se mostrará su panel de propiedades.

En el informe puedes situar la imagen en la zona que quieras y ajustar el tamaño de la caja que contiene la imagen. En la pestaña de properties y dentro de ella la pestaña "Image", tendrás algo similar a lo de la siguiente figura

Propiedades de una imagen en Jasper Studio
Propiedades de una imagen en Jasper Studio

En "Expression" podrás ver el path, entre comillas dobles, de tu imagen. Puedes ajustarlo si no es exactamente como quieres o podrías poner cualquier Path. En "Scale Image" puedes indicar cómo quieres que se redimensione la imagen dentro de la caja de imagen. Es importante mantener las comillas.

La opción "Retain Shape", por defecto, ajusta la imagen al tamaño de la caja, pero sin modificar su relación de aspecto. Si eliges "Fill Shape" rellenará la caja, pero deformará la imagen para que ocupe toda la caja. Tienes otras opciones con las que puedes jugar. El aspecto de la plantilla con la imagen que he usado de ejemplo, sería la siguiente

Imagen colocada sobre la plantilla de Jasper Studio
Imagen colocada sobre la plantilla de Jasper Studio

Una vez hecho esto, listo. Si previsualizamos el informe, verás la imagen en él

Imagen resultante en el informe de Jasper Report
Imagen resultante en el informe de Jasper Report

Añadir imagen base64 en Jasper Report[editar]

Poner una imagen de un fichero trae el problema de que dicha imagen debe estar en el disco donde vayamos a generar el informe y en el mismo path que diga el informe, sea absoluto o relativo. Tenemos la posiblidad de que el mismo fichero lleve la imagen embebida, codificada base64. Esta codificación nos dará la imagen como un simple String de texto, muy largo, pero como String de texto. Esto nos permite añadirlo dentro del fichero jrxml, que no es más que un fichero XML

Primero debemos obtener el String codificado base64 de nuestra imagen. Aparte de otras posiblidades, hay herramientas online que lo hacen. Si buscas en internet "image base64 encoder" te saldrán varias. En mi caso voy a usar https://base64.guru/converter/encode/image . En esa web, tienes los siguientes parámetros a rellenar

  • DataType. Si tienes un fichero en tu PC de imagen (Local File) o vas coger una de internet (Remote URL).
    • Local File si es lo que has elegido en DataType. Ahí tendrías que subir tu fichero de imagen.
    • Remote URL si es lo que has elegido en DataType. Ahí tendrías que poenr la URL de internet donde esté tu imagen.
  • Output Format. Es importante que elijas "Plain Text - just de base64 Value". Las otras opciones también te dan la imagen codificada base64, pero añaden tags html, xml, etc que luego hay que quitar.

Pulsas el botón "Encode Image to Base64" y copias el texto. La siguiente imagen muestra lo que se vería en esa web, con el texto base64 incluido. Tienes un link "copy" y "download" a la derecha de la caja de texto base64

Web para convertir una imagen en código base64
Web para convertir una imagen en código base64

Una vez tenemos nuestro texto base64, nos basta añadir la imagen en el informe. Nos preguntará por el tipo de imagen, como puedes ver en al imagen del primer apartado. Elegimos la opción "No image (just create ...". En el panel de propiedades de la imagen, campo "Expression", donde antes poniamos el path, debemos poner esto

new ByteArrayInputStream(Base64.getDecoder().decode("xxxxxxxxxxxxxxxxxxxxxxxxx"))

donde xxxxxxxxxxxxxxxxxx es el codigo base64 de la imagen que hemos obtenido con la web base64 encoder.

Pegar una expresión tan larga en la caja "Expression" de la pestaña de propiedades, en mi caso, no le ha sentado bien a Jaspersoft Studio, que se queda colgado un rato hasta que lo procesa. Y luego, cada vez que tocas algo mientras tienes esa pestaña abierta. Para evitar esto, puedes poner en vez de todo el código base64, un pequeño texto que luego te sea fácil de localizar, por ejemplo "pepe". Cierra estas ventana de propiedades de la imagen y en el panel de diseño del informe, selecciona la pestaña "source". Ahí verás el código XML del diseño del informe. Busca "pepe" y reemplázalo por tu código base64.

Todo listo, si previsualizamos el informe, veríamos la imagen en él.

Añadir imagen dinámicamente en Jasper Report[editar]

Para añadir una imagen dinámicamente en el momento de generar el informe, debemos crear un parámetro en jasper de tipo java.lang.String, con el nombre que queramos y asegurarnos de marcar la opción "Is For Prompting".

Parámetro para añadir una imagen dinámicamente al informe Jasper Report
Parámetro para añadir una imagen dinámicamente al informe Jasper Report

Al parámetro le hemos puesto de nombre "from_code_image". Una vez hecho esto, añadimos una imagen al informe, por ejemplo, con la opción "No Image (just create ...". En la pestaña de propiedades de la imagen, vamos a "Expression" y escribimos lo siguiente

$P{from_code_image}

Sin comillas dobles. Siendo "from_code_image" el nombre del parámetro que acabamos de crear.

Cuando generemos el informe, al tener el parámetro marcada la opción "Is For Prompting", nos pedirá un valor para dicho parámetro. Debemos poner bien un path donde haya una image, bien una URL.

Si definimos el parámetro de tipo java.lang.Object y generamos el informe desde código Java, podríamos pasar un ByteArrayInputStream como valor del parámetro, de la siguiente forma

Map<String,Object> parameters = new HashMap<>();
FileInputStream fis = new FileInputStream("src/main/files/the_image.png");
byte[] image = new byte[fis.available()];
fis.read(image);
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(image);
parameters.put("from_code_image",byteArrayInputStream);

siendo "parameters" el Map que pasaremos a JasperReports Library para generar el informe.

Si ponemos que el parámetro es de tipo java.awt.Image, podríamos pasar, desde código, una Image, de la siguiente manera

Map<String,Object> parameters = new HashMap<>();
ImagenIcon icon = new ImageIcon("src/main/files/the_image.png");
parameters.put("from_code_image", icon.getImage());

Añadir imagen desde una URL en Jasper Report[editar]

Para añadir una imagen de una URL en Jasper Report, no tenemos nada especial que hacer. Añade la imagen como si fuera un fichero o con la opción "No image (just create ...". En la pestaña de propiedades de la imagen, en el campo "Expression", por entre comillas dobles la URL donde esté la imagen.

Añadir una imagen desde una URL al informe Jasper Report
Añadir una imagen desde una URL al informe Jasper Report

Añadir imagen de background en Jasper Report[editar]

Las versiones nuevas de Jaspersoft Studio tienen una zona (banda) adicional llamada "background". Para añadir una imagen de background en nuestro informe, basta añadirla en esa banda.

Esta banda no está visible en la pestaña principal de diseño del informe, pero si la tenemos como un nodo en la pestaña "outline". Podemos arrastra el componente "Image" de la pestaña "Palette" sobre este nodo para añadir la imagen a la banda de "background". Nos pedirá qué tipo de imagen queremos cargar, que puede ser cualquiera de las usadas en los apartados anteriores. La siguiente imagen muestra nuestra imagen añadida en el nodo "background".

Añadir una imagen de background al informe Jasper Reports
Añadir una imagen de background al informe Jasper Reports

Al hacer esto, la imagen aparece también en la pestaña principal de diseño del informe. Podemos ajustar el tamaño de la imagen para ocupar lo que deseemos pero ....

NO redimensiones ni arrastres la imagen para ocupar las demás zonas (header, detail, footer, etc). En su lugar, estira la imagen hacia la derecha y hacia abajo. Aunque aparentemente quede en la parte de abajo del informe, a la hora de genearlo, lo superpondrá. A todos los efectos, al generar el informe, es como si se cogiera la banda "background" y se pusiera debajo del resto del informe

Una vez redimensionada, en el panel de diseño principal podrías ver algo como esto

Imagen de fondo en la pantalla de diseño del informe Jasper Report
Imagen de fondo en la pantalla de diseño del informe Jasper Report

Fíjate que la zona background está por debajo de la última zona del informe, en este caso, summary. Y fíjate que la imagen la hemos redimensionado hacia abajo para hacerla grande. Si previsualizamos el informe, tendremos lo siguiente

Resultado del informe Jasper Report con imagen de background
Resultado del informe Jasper Report con imagen de background