[英]How to set relative path of images in report?
所以我有一個顯示jasper報告的Java應用程序。 我使用用於Netbeans的iReport插件在報表中放置了一張圖像。 在當前計算機上,一切都可以正常顯示,但是當我嘗試在另一台計算機上運行已編譯的jar時,報告將不會加載。
從Windows控制台來看,我認為這是因為映像的路徑是絕對的,即引用開發計算機硬盤上的特定文件夾。 我需要使其相對於jar文件。 我已將圖像放入包裝中,並確認它在已編譯的jar中。 但是,當我將iReport中的“圖像表達式”值更改為“ /reports/Logo.jpg”(其中/ reports是程序包)並運行該應用程序時,
EXCEPTION: Byte data not found at : /reports/Logo.jpgnet.sf.jasperreports.engine.JRException: Byte data not found at : reports/Logo.jpg
有什么想法怎么辦? 我非常困惑,不勝感激!
更新:知道了。 不得不在報表中創建一個參數,並從圖像表達式中調用該參數。 然后,我用Java代碼創建了一個HashMap和InputStream並將輸入流放入哈希映射! 這么簡單的事情就需要這么多代碼!
Java代碼 :
//to get images to display in report, pass their relative path as input stream and add to HashMap
//there must be one stream and one HashMap per image
InputStream imgInputStream = this.getClass().getResourceAsStream("/reports/omacLogo.jpg");
InputStream imgInputStream2 = this.getClass().getResourceAsStream("/reports/omacLogo.jpg");
parameters.put("omacLogo", imgInputStream);
parameters2.put("omacLogo", imgInputStream2);
InputStream jasper1 = this.getClass().getResourceAsStream("/reports/OmacYTDReportFinalpg1.jasper");
InputStream jasper2 = this.getClass().getResourceAsStream("/reports/OmacYTDReportFinalpg2.jasper");
JasperPrint jp1 = JasperFillManager.fillReport(jasper1, parameters,new JRBeanCollectionDataSource(ie.orderofmalta.BeanFactory.getCalcs()));
JasperPrint jp2 = JasperFillManager.fillReport(jasper2, parameters2, new JRBeanCollectionDataSource(ie.orderofmalta.BeanFactory.getCalcs()));
希望這對別人有幫助! 請注意,您必須為要放置的每個圖像創建單獨的哈希圖和輸入流,即使它是同一圖像也是如此。
我個人還沒有嘗試過用罐子這種方式,但我希望它能對您有所幫助。 如前所述,問題出在文件路徑。 在iReport工具上,您可以使用相對路徑,並且可以在預覽中使用,但是當報表生成集成在應用程序中時,它只能與絕對路徑一起使用。
我解決此缺點的方法是通過獲取Java應用程序中圖像的絕對路徑,並將其作為參數傳遞給報表。 例:
String image = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/Cards_Template/front.jpg");
注意:我已經構建了一個JSF應用程序,這就是為什么我要從其上下文中獲取路徑。 如果不這樣做,Java的IO或NIO API確實有一些方法可以做到這一點。 基本上,我從相對路徑獲得絕對路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.