2010-04-30 34 views
22

Tôi muốn hiển thị hình ảnh trên báo cáo jasper. Tôi có thông tin sau đây trên .jrxml:Làm cách nào để hiển thị hình ảnh trên báo cáo jasper?

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

Hình ảnh logo.jpg nằm trong cùng thư mục với .jrxml. Bởi chỉ cần nói rằng nó đã không làm việc cho tôi. Tôi googled một chút và phát hiện ra rằng báo cáo jasper xem xét những gì tôi đặt trên .jrxml như một đường dẫn tương đối đến thư mục JVM và để thay đổi điều này tôi cần phải vượt qua như là một tham số "REPORT_FILE_RESOLVER" một FileResolver trả về tập tin. Vì vậy, tôi đã làm như sau trong java của tôi (nằm trong cùng một vị trí như .jrxml và hình ảnh)

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

nào nên trả lại hồ sơ dự kiến, nhưng tôi vẫn có được một

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

Tôi đang làm gì sai?

Cảm ơn!

+0

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

Trả lời

11

Dưới đây là vấn đề:

Như tôi đã nói trước đây tôi có trong cùng một thư mục. jrxml, logo.jpg và .java sử dụng .jrxml.

Cái này là các fileResolver

FileResolver fileResolver = new FileResolver() { 

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

không trả lại tập tin hình ảnh. Tôi phát hiện ra nó được ánh xạ vào một thư mục khác và không phải là thư mục tôi mong đợi. Vì vậy, tôi đã thay đổi nó thành:

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

Và điều đó đã hiệu quả. Tôi quên một thực tế rằng:

Một tên đường dẫn tương đối, ngược lại, phải được giải thích về thông tin lấy từ một số tên đường dẫn khác. Theo mặc định, các lớp trong gói java.io luôn giải quyết tên đường dẫn tương đối so với thư mục người dùng hiện tại . Thư mục này là được đặt tên bởi thuộc tính system.dir, và thường là thư mục trong mà máy ảo Java được gọi là được gọi.

(lấy từ api java - File (Java Platform SE 6))

Thư mục trong đó JVM được gọi không phải là người tôi có tất cả các dữ liệu này.

Cảm ơn!

19

tôi đã thực hiện công việc này bằng cách thông qua một tham số quy định cụ thể vị trí tuyệt đối của file:

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

Hãy thử khai báo một tham số như myImg của loại InputStream trong trang báo cáo của bạn. Khai báo kiểu này cả cho param và giữ chỗ ảnh trên trang. Sau đó, lấy hình ảnh từ classpath bằng cách sử dụng một cái gì đó như (giả sử tên hình ảnh là 'imgName.ext' và nó nằm trong gói có tên là 'của bạn.gói ')

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

17

tôi làm điều đó theo cách này - hình ảnh được truyền bằng đường dẫn:

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> 

... hoặc hình ảnh được truyền như InputStream (Tôi không biết tại sao, nhưng <image> cần phải có thuộc tính onErrorType được đặt thành "Blank", nếu không nó không hoạt động - ném ngoại lệ):

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> 
Các vấn đề liên quan