2010-04-30 10 views
22

Quiero mostrar una imagen en un informe de jaspe. Tengo el siguiente en la .jrxml:¿Cómo mostrar una imagen en el informe de jaspe?

<image> 
    <reportElement x="181" y="0" width="209" height="74"/> 
    <imageExpression class="java.lang.String"><![CDATA["logo.jpg"]]></imageExpression> 
</image> 

La imagen logo.jpg está en el mismo directorio que el .jrxml. Simplemente poniendo eso no funcionó para mí. Busqué en Google un poco y descubrí que el informe jasper considera lo que puse en .jrxml como una ruta relativa al directorio JVM y que para cambiar esto necesito pasar como un parámetro "REPORT_FILE_RESOLVER" un FileResolver que devuelve el archivo. Por lo tanto, hice lo siguiente en mi .java (se encuentra en el mismo lugar que el .jrxml y la imagen)

FileResolver fileResolver = new FileResolver() { 

@Override 
public File resolveFile(String fileName) { 
    return new File(fileName); 
} 
}; 
HashMap<String, Object> parameters = new HashMap<String, Object>(); 

parameters.put("REPORT_FILE_RESOLVER", fileResolver); 
... 

que debe devolver el archivo esperado, pero aún así obtener una

net.sf.jasperreports.engine.JRException: Error loading byte data : logo.jpg 
    at net.sf.jasperreports.engine.util.JRLoader.loadBytes(JRLoader.java:301) 
    at net.sf.jasperreports.engine.util.JRLoader.loadBytesFromLocation(JRLoader.java:479) 
    at net.sf.jasperreports.engine.JRImageRenderer.getInstance(JRImageRenderer.java:180) 
... 

¿Qué estoy haciendo mal?

Gracias!

+0

Ver: http://stackoverflow.com/a/39320863/59087 –

Respuesta

11

Aquí era el problema:

Como ya he dicho anteriormente que tengo en el mismo directorio del. jrxml, el logo.jpg y el .java que usa el .jrxml.

La cosa es que el fileResolver

FileResolver fileResolver = new FileResolver() { 

@Override 
public File resolveFile(String fileName) { 
    return new File(fileName); 
} 
}; 

no regresaron el archivo de imagen. Descubrí que estaba mapeado en un directorio diferente y no en el que estaba esperando. Entonces, lo cambié a:

FileResolver fileResolver = new FileResolver() { 

    @Override 
    public File resolveFile(String fileName) { 
     URI uri; 
     try { 
      uri = new URI(this.getClass().getResource(fileName).getPath()); 
      return new File(uri.getPath()); 
     } catch (URISyntaxException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      return null; 
     } 
    } 
}; 

Y eso funcionó. Olvidé el hecho de que:

Una ruta relativa, por el contrario, , debe interpretarse en términos de información tomada de alguna otra nombre de ruta. De forma predeterminada, las clases en el paquete java.io siempre resuelven las rutas de acceso relativas con respecto al directorio de usuario actual . Este directorio es nombrado por la propiedad del sistema user.dir, y es típicamente el directorio en que se invocó a la máquina virtual Java .

(tomado de la API de Java - File (Java Platform SE 6))

El directorio en el que se invoca la JVM no es el que tengo todos estos datos.

Gracias!

19

que he hecho este trabajo por el que pasa un parámetro que especifica la ubicación absoluta del archivo:

<imageExpression class="java.lang.String"> 
     <![CDATA[$P{REPORTS_DIR} + "/images/logo.jpg"]]> 
</imageExpression> 
8

Intente declarar un parámetro como myImg de tipo InputStream en su página de informe. Declare este tipo tanto para param como para marcador de imagen en la página. Luego, toma la imagen de classpath usando algo como (suponiendo que el nombre de la imagen es 'imgName.ext' y está en el paquete llamado 'your.paquete ')

InputStream imgInputStream = this.getClass().getResourceAsStream("/your/package/imgName.ext"); parameters.put("myImg", imgInputStream);

17

lo hago de esta manera - la imagen se pasa por el camino:

HashMap<String, Object> params = new HashMap<String, Object>(); 
params.put("logo", ClassLoader.getSystemResource("logo.jpg").getPath()); 

.jrxml

<parameter name="logo" class="java.lang.String"/> 
... 
<image> 
    <reportElement x="0" y="1" width="100" height="37"/> 
    <imageExpression><![CDATA[$P{logo}]]></imageExpression> 
</image> 

... o la imagen se pasa como InputStream (No sé por qué, pero <image> necesita tener el atributo onErrorType establecido en "Blank", de lo contrario no funciona - lanza una excepción):

HashMap<String, Object> params = new HashMap<String, Object>(); 
params.put("logo", ClassLoader.getSystemResourceAsStream("logo.jpg")); 

.jrxml

<parameter name="logo" class="java.io.InputStream"/> 
... 
<image onErrorType="Blank"> 
    <reportElement x="0" y="1" width="100" height="37"/> 
    <imageExpression><![CDATA[$P{logo}]]></imageExpression> 
</image> 
Cuestiones relacionadas