Mostrar una matriz de bytes como una imagen en un informe de Jasper

Tengo una imagen guardada como un byte[] y me gustaría mostrarla como una imagen en un JasperReport. He intentado obtener los datos de los métodos de Java:

 public InputStream getImage(){ return new ByteArrayInputStream(getImageByteArray()); } 

y

 public Image getImage() throws IOException{ return ImageIO.read(new ByteArrayInputStream(getImageByteArray())); } 

y

 public String getImage(){ return new String((new org.apache.commons.codec.binary.Base64()).encode(getImageByteArray())); } 

pero ninguno de ellos parece estar funcionando.

El jrxml se ve así:

     

Algunas de las cosas que bash obtienen excepciones y algunas imprimen el informe Jasper, pero el área donde se supone que está la imagen está en blanco. Sé que los datos de imagen están allí porque puedo mostrarlos en una página JSF. Los datos de imagen son datos SVG.

Transcodificador de imagen personalizado

Escriba un transcodificador de imagen personalizado que pueda leer un archivo SVG y transformar ese recurso en un archivo PNG o SVG. Al exportar como PDF, está bien usar un archivo SVG directamente. Considerar:

 import java.awt.Color; import java.io.*; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.util.JRLoader; import org.apache.batik.transcoder.*; import static org.apache.batik.transcoder.image.ImageTranscoder.*; import org.apache.batik.transcoder.image.PNGTranscoder; public class ImageTranscoder { public static InputStream asSVG(final String file) throws JRException { return new ByteArrayInputStream(load(file)); } public static InputStream asPNG(final String file) throws TranscoderException, JRException { return asPNG(load(file)); } public static InputStream asPNG(final byte[] svg) throws TranscoderException { final ByteArrayOutputStream outBytes = new ByteArrayOutputStream(); final ByteArrayInputStream inBytes = new ByteArrayInputStream(svg); final TranscoderInput input = new TranscoderInput(inBytes); final TranscoderOutput output = new TranscoderOutput(outBytes); final PNGTranscoder transcoder = new PNGTranscoder(); transcoder.addTranscodingHint(KEY_BACKGROUND_COLOR, Color.white); transcoder.addTranscodingHint(KEY_FORCE_TRANSPARENT_WHITE, true); transcoder.transcode(input, output); final byte[] bytes = outBytes.toByteArray(); return new ByteArrayInputStream(bytes); } private static byte[] load(final String file) throws JRException { return JRLoader.loadBytesFromResource(file); } } 

Importar transcodificador

En el archivo JRXML, importe la clase totalmente calificada:

  

Apply Image Transcoder

Arrastre y suelte una Imagen de la paleta en el informe, como de costumbre. Establezca su expresión a:

 ImageTranscoder.asSVG($P{IMAGES_PATH} + $P{IMAGE_FILENAME} + ".svg") 

Si necesita absolutamente una versión PNG, transcodifíquela sobre la marcha:

 ImageTranscoder.asPNG($P{IMAGES_PATH} + $P{IMAGE_FILENAME} + ".svg") 

HTML vs PDF

Con HTML, normalmente se prefieren las imágenes PNG. Hay una serie de enfoques que puede tomar para diferenciar HTML (PNG) de PDF (SVG). Una forma sencilla es asignar dos valores de clave diferentes a dos elementos de imagen diferentes. Por ejemplo:

         

Luego puede excluir uno u otro según el tipo de exportación:

   

Resumen

Si bien es más sencillo incluir una imagen PNG, convertir esa imagen PNG a SVG es un paso adicional que puede evitarse. Dado que la Biblioteca JasperReports utiliza el motor Batik para renderizar imágenes, aproveche para convertir un archivo SVG a PNG cuando se genera el informe.

De esta manera, el SVG sirve como una fuente única para todos los formatos, independientemente de si se utiliza un archivo PNG o SVG en el informe.

Asegúrese de establecer los parámetros IMAGES_PATH e IMAGE_FILENAME según corresponda.

HTML y Base64

Forzar la imagen para incrustar utilizando:

  

La imagen PNG se convierte en una cadena codificada en Base64:

  

Esto hará que el informe cargue un poco más rápido (sin solicitud HTTP adicional para la imagen) y simplificará la architecture, ya que elimina una dependencia externa. Es decir, ya no se requiere que un servidor web sirva la imagen, ya que está totalmente integrada.

Suponiendo que tiene bytes de imagen codificados en base64, puede usar los siguientes

       

Puedes intentar esto:

Establezca su parámetro de imagen (aquí está img ) a InputStream

    

A continuación, establezca onErrorType = “En blanco” para su elemento de imagen (En realidad, no sé la razón para esto :))

     

Propongo una solución simple. Funciona, lo estoy usando. De esta forma evitamos el código intermedio y las modificaciones a nuestra aplicación.

Debemos establecer la siguiente Importación:

  

La definición de nuestro campo para la imagen debe ser de tipo Objet:

  

Y luego en el cuerpo del informe, debemos colocar la imagen con la siguiente expresión:

     

Eso es todo. ¿Cómo funciona la solución? Importamos la biblioteca javax.swing.ImageIcon , que nos permite crear un nuevo ImageIcon a partir de un byte[] , luego podemos convertir un ImageIcon a Image usando getImage() .

La definición de nuestro campo para la imagen debe ser de tipo Objet:

Y luego en el cuerpo del informe, debemos colocar la imagen con la siguiente expresión:

este código es trabajo para mí …