2010-09-30 207 views
2

我使用jasper報告庫與GWT應用程序。賈斯珀報告與HTML格式

這些報告生成與CSV格式很好,但與HTML格式它生成HTML頁面的圖標失蹤圖片。

我知道碧玉使用稱爲「PX」的透明圖像,未找到該圖像。

我該如何解決這個問題?

由於提前

+1

我有同樣的問題。如果您接受答案,您可以提供解決方案嗎?你如何傳遞報告的圖像路徑? – Manu 2012-11-29 15:57:22

回答

0

嘗試在你的圖像作爲參數傳遞到報表,這樣就不必擔心圖像路徑。

您可以將參數的類型設置爲BufferedImage或任何圖像類適合的類型。

0

我的解決方案是使用數據URI。這不是很優雅,因爲它擴大了HTML的大小,並且在IE8之前的IE中不起作用,但它確實可以讓您不用擔心Jasper向您發送的圖像附件創建文件。

如果你要實現這一點,你要這個參數添加到您的要求:

<argument name="IMAGES_URI"><![CDATA[data:]]></argument> 

然後,你需要解析的JasperServer發回的報告HTML:

foreach ($attachments as $name => $attachment) { 
    // Cut off the cid: portion of the name. 
    $name = substr($name, 4); 

    // Replace any image URIs with a data: uri. 
    if (strtolower(substr($name, 0, 4)) !== 'uuid' && strtolower($name) !== 'report') { 
     if (strtoupper(substr($attachment, 0, 3)) === 'GIF') { 
      // It's a GIF. 
      $report = str_replace("data:$name", 'data:image/gif;base64,' . base64_encode($attachment), $report); 
     } elseif (/* more file type tests */) { 
      // and so on... 
     } 
    } 
} 

對於大圖像,最好按照Gordon的建議做,並傳入一個參數,指定永久存儲在服務器上的文件的URL。此方法更適合處理JasperServer嘗試投擲的任何意外圖像的故障安全。

0

我對這個討論有點遲,但這是我一直在使用的。關鍵是將imagesMap傳遞給會話屬性和導出器參數,並設置IMAGES_URI導出器參數。

private void exportReportAsHtml(HttpServletRequest request, HttpServletResponse response, JasperPrint jasperPrint) throws IOException, JRException { 
    response.setContentType("text/html"); 

    request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint); 

    Map imagesMap = new HashMap(); 
    request.getSession().setAttribute("IMAGES_MAP", imagesMap); 

    JRHtmlExporter exporter = new JRHtmlExporter(); 
    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); 
    exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, response.getWriter()); 
    exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP, imagesMap); 
    exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "image?image="); 

    exporter.exportReport(); 

}

+3

甚至不能遠程線程安全。絕不應該在網絡應用程序中完成。如果祈禱告訴客戶有兩個瀏覽器選項卡打開並同時生成報告 – MJB 2012-10-02 01:11:31

+0

上述代碼需要先檢查現有的映像映射,然後再替換它,但除了打開兩個選項卡的用戶將其導出兩次後,它們纔會導出報告。 – 2017-07-17 21:13:38

1

如果沒有圖像顯示,那麼你可以這樣做:

JasperPrint jasperPrint = JasperFillManager.fillReport(path, parameters, con); 
JRHtmlExporter htmlExporter = new JRHtmlExporter(); 
response.setContentType("text/html"); 
request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint); 
htmlExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); 
htmlExporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out); 
htmlExporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, false); 
htmlExporter.exportReport(); 

重要的線是這個:

htmlExporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, false); 

這會使所有的「px」圖像消失。