我使用jasper報告庫與GWT應用程序。賈斯珀報告與HTML格式
這些報告生成與CSV格式很好,但與HTML格式它生成HTML頁面的圖標失蹤圖片。
我知道碧玉使用稱爲「PX」的透明圖像,未找到該圖像。
我該如何解決這個問題?
由於提前
我使用jasper報告庫與GWT應用程序。賈斯珀報告與HTML格式
這些報告生成與CSV格式很好,但與HTML格式它生成HTML頁面的圖標失蹤圖片。
我知道碧玉使用稱爲「PX」的透明圖像,未找到該圖像。
我該如何解決這個問題?
由於提前
嘗試在你的圖像作爲參數傳遞到報表,這樣就不必擔心圖像路徑。
您可以將參數的類型設置爲BufferedImage或任何圖像類適合的類型。
我的解決方案是使用數據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嘗試投擲的任何意外圖像的故障安全。
我對這個討論有點遲,但這是我一直在使用的。關鍵是將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();
}
甚至不能遠程線程安全。絕不應該在網絡應用程序中完成。如果祈禱告訴客戶有兩個瀏覽器選項卡打開並同時生成報告 – MJB 2012-10-02 01:11:31
上述代碼需要先檢查現有的映像映射,然後再替換它,但除了打開兩個選項卡的用戶將其導出兩次後,它們纔會導出報告。 – 2017-07-17 21:13:38
如果沒有圖像顯示,那麼你可以這樣做:
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」圖像消失。
我有同樣的問題。如果您接受答案,您可以提供解決方案嗎?你如何傳遞報告的圖像路徑? – Manu 2012-11-29 15:57:22