Problema al usar Certificado analitico con imagen cargada de personas_foto

Buenos dias. Estoy teniendo un problema que quizas sea simple de rsolver, pero no lofro encontrar la solución.
En el Certificado Analítico que viene por defecto en la versión 3.21.2 o en cualquier otra versión 3.x, no logro hacerlo funcionar, ya que al intentar generar el pdf, el jasper me da un error con respecto al campo imagen de la tabla mdp_personas_foto que se intenta recuperar en el query del jrxml.
Esto me pasa, no solo con el ireport, sino también en las instalaciones de guarani, si no personalizo el certificado analítico (quitando la foto del suplemento al título) y uso el que viene por defecto en Guarani
Comento que he intentado con fotos jpg o png subidas en el campo bytea de postgresql, intenté con versiones diferentes de jar de postgresql, pero hasta el momento no he logrado que funcione.

En la operación Administrar personas, como en el visor de dbveaver, puedo visualizar correctamente las fotos.

Dejo a continuación el error por si a alguien le ha pasado algo similar:
Error filling print… Error evaluating expression : Source text : net.sf.jasperreports.engine.util.JRImageLoader.loadImage ((byte ) $F{imagen})
net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression : Source text : net.sf.jasperreports.engine.util.JRImageLoader.loadImage ((byte ) $F{imagen}) at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:263) at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:611) at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:579) at net.sf.jasperreports.engine.fill.JRFillElement.evaluateExpression(JRFillElement.java:1016) at net.sf.jasperreports.engine.fill.JRFillImage.evaluateImage(JRFillImage.java:492) at net.sf.jasperreports.engine.fill.JRFillImage.evaluate(JRFillImage.java:472) at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:259) at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:456) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2067) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:788) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:298) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:152) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:963) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:873) at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:87) at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:287) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:760) at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:891) at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572) at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:997) Caused by: net.sf.jasperreports.engine.JRException: Image read failed. at net.sf.jasperreports.engine.util.JRJdk14ImageReader.readImage(JRJdk14ImageReader.java:73) at net.sf.jasperreports.engine.util.JRImageLoader.loadAwtImageFromBytes(JRImageLoader.java:167) at net.sf.jasperreports.engine.util.JRImageLoader.loadImage(JRImageLoader.java:185) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.invoke(StaticMetaMethodSite.java:43) at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.call(StaticMetaMethodSite.java:88) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116) at guarani_1732464742005_436103.evaluate(calculator_guarani_1732464742005_436103:353) at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:250) … 19 more
Print not filled. Try to use an EmptyDataSource…

Muchas gracias!!!

Pablo

Hola Pablo, buen día!
Le hago una consulta, se refieren al certificado analítico en sí o al suplemento al título?
El suplemento ya viene preparado para aceptar la incrustación de la foto, pero el analítico no, eso lo tendrían que personalizar, y podrían seguir como ejemplo la estructura del suplemento para ello.

Saludos!

Buen día, Ariana. Muchas gracias por la respuesta!!!
Lo que da error es cuando intento dejar el Certificado Analítico que viene por defecto con las versiones de SIU Guarani, y que incrustan el suplemento en el mismo con la foto.
Pareciera ser que estuviera faltando alguna parametrización, configuración o instalación de alguna librería para que bel jasper no diera error al querer cargar la imagen dentro de la plantilla del suplemento.
Esto pasa, ya sea en una implementación de guarani, yendo por la generación del analítico desde las operaciones de egreso, así como si quiero probar el analítico completo con el suplemento desde el ireport.
Esto surge con la necesidad de incorporar el suplemento, y al probar el caf y suplemento original del siu, jos dimos cuenta que ya fallaba en nuestras implementaciones por la imagen.

Muchas gracias nuevamente.
Saludos!!!

Pablo

Hola Pablo, buen día!
Probamos el caso y no detectamos error.
Le hago una consulta, hicieron alguna personalización en el sistema? También les pedimos si pueden enviar los logs.

Saludos!

Buen día, Ariana. Disculpas por la demora en responder. El problema que teníamos es que nunca logramos que funcione el suplemento con la foto que viene desde la BD tal como viene la plantilla original.
O sea, en el objeto imagen del jasper, la expresión net.sf.jasperreports.engine.util.JRImageLoader.loadImage ((byte ) $F{imagen}) daba error.
Parece ser que es por el tipo de dato en la base de datos, de la foto de la persona, que es de tipo bytea.
Logramos resolverlo para que el select de la imagn en el query, en lugar de traer el tipo de dato bytea, lo traiga con otro formato de la siguiente manera:

encode(imagen,‘base64’) as imagen

Luego, en el objeto de la imagen, la propiedad expresiion class la cambiamos a java.io.InputStream
Y en la propiedad Image expression, le colocamos la siguiente expresion:
net.sf.jasperreports.engine.util.JRImageLoader.getInstance(new SimpleJasperReportsContext()).loadAwtImageFromBytes(javax.xml.bind.DatatypeConverter.parseBase64Binary($F{imagen}))

Con estos cambios, logramos poder mostrar la imagen de la foto del alumno en el CAF.
Estamos trabajando este tema, no por la foto en si, sino para mostrar las firmas escaneadas de las autoridades en los CAF, y estamos analizando la manera de que las firmas, ya que son pocas, vengan cargadas de la BD.

Por nuestra parte, el tema queda resuelto.

Solo dejo la explicación, por si alguien más también ha tenido problemas con la carga de imágenes desde la BD para las plantillas jasper.

Saludos y que sigas muy bien!!!

Pablo

Buenos dias Pablo como va, estamos en la misma situacion.. nos podrias compartir el CertificadoAnalitico.jrxml ? y otra consulta que version de java usaron? saludos!

Buen día Pablo, logramos hacerlos andar la foto en el CertificadoAnalitico.jrxml utilizando la version java-8-openjdk siguiendo los pasos que indicaste. ¿vos pudiste hacerlo andar en java-11-openjdk o posterior?
Muchas gracias,
Gabriel.

Hola, Fernando. Mil disculpas por la demora. Adjunto el analitico que estamos usando para que puedas observar el código sql de recuperación de la imagen y de como configuro el objeto de la imagen, tl como comentaba antes. Esto aun no lo teneos productivo, solo lo estamos probando, pero funciona con la versión 7 de jdk perfectamente (la misma que usa la versión 5.6 de iReport)

Creo no poder subir un zip con la version de jre, pero busca dentro del jasper5.6, la carpeta jdk1.7.0_80 y llevala a algun sitio del servidor en el que tengas guarani . Luego, al ejecutar el jasper, en lugar de ejecutar con “java” (que toma la versión instalada en el sistema que en mi caso es la 11 y que no funciona con estas funciones), ejecuto /jre/bin/java

CAF_prueba_firmas.jrxml.txt (53,9 KB)

Hola, Gabriel!!! Excelente!!! Yo no había probado con la versión 8, solo con la 7. Con la 11 no me funcionó a mi.
Saludos y exitos!!!

Pablo

Muchas gracias por la respuesta Pablo.

Saludos,
Gabriel.