java - poner - ¿Cómo mostrar una imagen en el informe jasper?
como poner una imagen en jasperreports (4)
Quiero mostrar una imagen en un informe de jaspe. Tengo lo siguiente en el .jrxml:
<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 que no funcionó para mí. Busqué en Google un poco y descubrí que el informe jaspe considera lo que pongo en el .jrxml como una ruta relativa al directorio JVM y que para cambiar esto debo pasar como parámetro "REPORT_FILE_RESOLVER" un FileResolver que devuelve el archivo. Entonces, hice lo siguiente en mi .java (está ubicado 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);
...
Lo que debería devolver el archivo esperado, pero todavía tengo un
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!
Aquí estaba el problema:
Como dije anteriormente, tengo en el mismo directorio el .jrxml, el logo.jpg y el .java que usa el .jrxml.
La cosa es que el archivo Resolver
FileResolver fileResolver = new FileResolver() {
@Override
public File resolveFile(String fileName) {
return new File(fileName);
}
};
No devolvió el archivo de imagen. Descubrí que estaba asignado a un directorio diferente y no al que esperaba. 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 de acceso relativa, por el contrario, debe interpretarse en términos de información tomada de otra ruta de acceso. Por defecto, las clases en el paquete java.io siempre resuelven las rutas de acceso relativas contra el directorio del usuario actual. Este directorio es nombrado por la propiedad del sistema user.dir, y suele ser el directorio en el que se invocó la máquina virtual Java.
(tomado de la api java - Archivo (Java Platform SE 6) )
El directorio en el que se invoca la JVM no es el que tengo todos estos datos.
¡Gracias!
He hecho este trabajo pasando un parámetro que especifica la ubicación absoluta del archivo:
<imageExpression class="java.lang.String">
<![CDATA[$P{REPORTS_DIR} + "/images/logo.jpg"]]>
</imageExpression>
Intente declarar un parámetro como myImg de tipo InputStream en su página de informe. Declare este tipo para los marcadores de posición param y de imagen en la página. Luego, tome la imagen de classpath usando algo como (asumiendo que el nombre de la imagen es ''imgName.ext'' y está en el paquete llamado ''your.package'')
InputStream imgInputStream = this.getClass().getResourceAsStream("/your/package/imgName.ext"); parameters.put("myImg", imgInputStream);
Lo hago de esta manera - la imagen se pasa por 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
configurado en "Blank"
; de lo contrario, no funciona: lanza la 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>