2010-04-30 13 views
22

Voglio mostrare un'immagine su un report jasper. Ho il seguente sul .jrxml:Come mostrare un'immagine sul report jasper?

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

L'immagine logo.jpg si trova nella stessa directory del .jrxml. Mettendo semplicemente che non ha funzionato per me. Ho cercato su google un po 'e ho scoperto che il report jasper considera cosa ho messo su .jrxml come percorso relativo alla directory JVM e che per cambiarlo ho bisogno di passare come parametro "REPORT_FILE_RESOLVER" a FileResolver che restituisce il file. Così, ho fatto quanto segue nel mio .java (si trova nella stessa posizione della .jrxml e l'immagine)

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); 
... 

Che dovrebbe restituire il file atteso, ma ho ancora ottenere 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) 
... 

Che cosa sto facendo di sbagliato?

Grazie!

+0

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

risposta

11

Qui era il problema:

Come ho detto in precedenza che ho nella stessa directory del. jrxml, logo.jpg e .java che utilizza il .jrxml.

La cosa è che il fileResolver

FileResolver fileResolver = new FileResolver() { 

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

non ha restituito il file di immagine. Ho scoperto che è mappato su una directory diversa e non quella che mi aspettavo. Così, l'ho cambiato in:

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; 
     } 
    } 
}; 

E ha funzionato. Ho dimenticato il fatto che:

Un percorso relativo, al contrario, deve essere interpretata in termini di informazioni prese da qualche altro percorso. Per impostazione predefinita, le classi in il pacchetto java.io risolvono sempre i nomi di percorso relativi rispetto alla directory utente corrente . Questa directory è denominata dalla proprietà di sistema user.dir, ed è in genere la directory in che la macchina virtuale Java è stata chiamata .

(tratto dal Java API - File (Java Platform SE 6))

La directory in cui la JVM è invocato non è quello che ho tutti questi dati.

Grazie!

19

Ho fatto questo lavoro passando un parametro che specifica la posizione assoluta del file:

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

Provare a dichiarare un parametro come myImg di tipo InputStream nella pagina del report. Dichiara questo tipo sia per param che per segnaposto immagine sulla pagina. Quindi, prendi l'immagine da classpath usando qualcosa di simile (assumendo che il nome dell'immagine sia 'imgName.ext' e si trovi nel pacchetto chiamato 'your.pacchetto ')

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

17

lo faccio in questo modo - immagine è passata dal percorso:

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 l'immagine è passato come InputStream (Non so perché, ma l'<image> deve avere l'attributo onErrorType impostato su "Blank", altrimenti non funziona - genera un'eccezione):

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> 
Problemi correlati