2010-04-30 7 views
22

Ich möchte ein Bild auf einem Jaspis-Bericht zeigen. Ich habe folgendes auf dem .jrxml:Wie zeige ich ein Bild auf Jaspis-Bericht?

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

Das Bild logo.jpg im selben Verzeichnis wie die .jrxml ist. Indem ich nur gesagt habe, dass es für mich nicht funktioniert hat. Ich habe ein wenig gegoogelt und herausgefunden, dass jasper report berücksichtigt, was ich auf die .jrxml als relativen Pfad zum JVM-Verzeichnis lege und dass ich als Parameter "REPORT_FILE_RESOLVER" einen FileResolver übergeben muss, der die Datei zurückgibt. Also, habe ich folgendes in meine .java (in gleichen Stelle wie die .jrxml und das Bild befindet)

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

die die erwartete Datei zurückgeben sollte, aber ich bekomme immer noch eine

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

Was mache ich falsch?

Danke!

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

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

Antwort

11

Hier war das Problem:

19

Ich habe diese Arbeit, indem ein Parameter, der die absolute Position der Datei Angabe gemacht

Wie ich bereits sagte, ich im gleichen Verzeichnis haben die. jrxml, das logo.jpg und die .java, die die .jrxml verwendet.

Die Sache ist die, dass die fileResolver

FileResolver fileResolver = new FileResolver() { 

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

die Bilddatei nicht zurückgegeben hat. Ich fand heraus, dass es auf ein anderes Verzeichnis und nicht auf das, was ich erwartet hatte, abgebildet war. Also habe ich es geändert 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; 
     } 
    } 
}; 

Und das hat geklappt. Ich habe vergessen, dass:

Ein relativer Pfadname, dagegen muss von einem anderen Pfadnamen genommen in Bezug auf Informationen interpretiert werden. Standardmäßig lösen die Klassen in das java.io-Paket immer relative Pfadnamen gegen das aktuelle Benutzerverzeichnis auf. Dieses Verzeichnis ist , benannt durch die Systemeigenschaft user.dir, , und ist normalerweise das Verzeichnis in , in dem die Java Virtual Machine aufgerufen wurde.

(aus der Java-API genommen - File (Java Platform SE 6))

Das Verzeichnis, in dem die JVM aufgerufen wird, ist nicht die, die ich all diese Daten haben.

Danke!

8

Versuchen Sie, auf Ihrer Berichtsseite einen Parameter wie myImg vom Typ InputStream zu deklarieren. Deklarieren Sie diesen Typ sowohl für den Parameter param als auch für den Bildplatzhalter auf der Seite. Nehmen Sie dann das Bild aus dem Klassenpfad, indem Sie etwas wie (angenommen der Bildname ist 'imgName.ext') im Paket mit dem Namen 'your' verwenden.Paket ')

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

17

Ich mache es auf diese Weise - Bild wird durch Pfad geführt:

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> 

... oder Bild wird als InputStream weitergegeben (Ich weiß nicht warum, aber <image> müssen onErrorType Attribut auf "Blank" gesetzt haben, sonst funktioniert es nicht - löst Ausnahme aus:

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> 
Verwandte Themen