miércoles, 31 de julio de 2013

Mostrar en un Reporte hecho en Jasper Reports imagenes almacenadas en una Base de Datos

En la actualidad, por mi trabajo surgió una necesidad puntual: Guardar los datos de una persona (incluida su fotografía) en una base de datos (para éste caso Oracle) y posteriormente generar un reporte con JasperReports que muestre toda esa información. En términos generales, mostrar la información de campos estilo VARCHAR en el reporte no implica mucha dificultas, pero al hablar de la imagen (almacenada en un BLOB) las cosas se ponen un poquito más interesantes, NO complicado del todo, pero que sí requiere cierto truquito que sabiendolo manejar podría ahorrarnos tiempo. La imagen siguiente, -como ya lo mencioné- muestra la estructira de la tabla y el tipo de dato en el que estoy almacenando la imagen en la base de datos (Blob).


Para hacer el upload de la imagen desde la capa de vista hacia la base de datos, empleo el componente p:fileUplod de Primefaces. El código desde la página xhtml (JSF) es el siguiente:



El backing bean de respaldo:

En donde "current" es una entidad Persona, la cual será persistida en la base de datos, nótese que la imagen se almacena en un byte[]



Ahora, en lo que respecta al reporte, uso la herramienta iReports, y debo comentar que estoy usando un JRBeanCollectionDataSource, es decir, envío una coleccion de objetos java para "alimentar" al reporte, pero no profundizaré mucho en lo que respecta al JRBeanCollectionDataSource pues será motivo de mi próximo post. Habiendo creado el reporte con un "empty DataSource" como muesta la siguiente imagen:



Debemos crear un field equivalente al atributo destinado a la fotografía de la entidad:



Tómose en cuenta que en las propiedades de dicho field, "Field Class" se declarará como java.lang.Object.



Ahora, desde la Paleta de componentes, arrastramos el elemento "Image" hacia el reporte:



Y en las propiedades de la imagen:



En "Image Expression" colocamos el siguiente código:

net.sf.jasperreports.engine.util.JRImageLoader.loadImage ((byte []) $F{fotoPer})



Y al generar el reporte, ya podemos mostrar una imagen cagada desde una base de datos: :)

No hay comentarios: