簡體   English   中英

如何在jasper報告上顯示圖像?

[英]How to show an image on jasper report?

我想在碧玉報告上顯示圖像。 我在.jrxml上有以下內容:

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

圖像logo.jpg與.jrxml位於同一目錄中。 只是說它對我不起作用。 我google了一下,發現jasper報告考慮我放在.jrxml上作為JVM目錄的相對路徑,並且為了改變這一點,我需要傳遞一個返回文件的FileResolver作為“REPORT_FILE_RESOLVER”參數。 所以,我在.java中做了以下內容(位於與.jrxml和圖像相同的位置)

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

哪個應該返回預期的文件,但我仍然得到一個

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

我究竟做錯了什么?

謝謝!

我通過傳遞一個指定文件絕對位置的參數來完成這項工作:

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

我這樣做 - 圖像通過路徑傳遞:

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>

...或者圖像作為InputStream傳遞(我不知道為什么,但<image>需要將onErrorType屬性設置為"Blank" ,否則它不起作用 - 拋出異常):

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>

這是問題所在:

正如我之前所說,我在同一目錄中有.jrxml,logo.jpg和使用.jrxml的.java。

問題是fileResolver

FileResolver fileResolver = new FileResolver() {

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

沒有返回圖像文件。 我發現它映射到一個不同的目錄而不是我期待的目錄。 所以,我把它改為:

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

這很有效。 我忘了這樣一個事實:

相反,相對路徑名必須根據從其他路徑名獲取的信息來解釋。 默認情況下,java.io包中的類始終解析當前用戶目錄的相對路徑名。 此目錄由系統屬性user.dir命名,通常是調用Java虛擬機的目錄。

(取自java api - File(Java Platform SE 6)

調用JVM的目錄不是我擁有所有這些數據的目錄。

謝謝!

嘗試declaring設置了一個param如類型的myImg InputStream報表中的一頁。 在頁面上為param和image占位符聲明此類型。 然后,使用類似的東西從類路徑中獲取圖像(假設圖像名稱為'imgName.ext',它位於名為'your.package'的包中)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM