如何在Jasper报表导出为HTML时强制图像URL?

3

一份报告使用了位于Web服务器上的图片(但不一定是应用程序的Web服务器)。该报告具有以下图像元素表达式:

"http://www.example.de/images/" + $F{picture}

当我使用JRXhtmlExporter将报告导出为HTML并在浏览器中显示生成的HTML时,图片不可见。 当我使用firebug检查img标记时,src参数与表达式不同,而是一些生成的文件夹和生成的文件名。 如果通过JasperExportManager.exportReportToPdfStream()将报告导出为PDF,则图像将正确显示在生成的PDF文件中。
我将JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR设置为Boolean.FALSE,但没有帮助。
我如何强制导出时保持图片URL不变?
注意:iReport的“Is Lazy”option选项可以实现我的需求。
3个回答

4
关键在于将 isLazy 属性设置为 true(如@ThomasKessler在这个回答中所示)。 这对我有效,并且可以无缺陷地生成三个报告(PDF,XLS,HTML)。
我按照以下步骤进行操作:

.jrxml

...
<parameter name="LOGO_URL" class="java.lang.String" isForPrompting="false"/>
...
<image isLazy="true">
  <reportElement uuid="24062838-1ede-4578-acdf-9a63662ea738" x="0" y="0" width="108" height="30"/>
   <imageExpression><![CDATA[$P{LOGO_URL}]]></imageExpression>
</image>
...

在一个.properties文件中,我已经配置了每个环境的内容:
my.logo.url=http://localhost:8080/MySite/img/my_logo.jpg

在一个 Servlet 中,我有三个方法:generatePDFReport、generateXLSReport 和 generateHTMLreport。在最后一个方法中,我有:
            Properties prop = Configurator.getProperties(BUNDLENAME);
            Connection con = ReportsDB.getConnection();
            String reportPathTag = prop.getProperty(Report.JASPERURL);

            Map parameters = Report.extractJasperParams(request.getParameterMap());
            String jasperPath = parameters.containsKey(reportPathTag) ? (String) parameters.get(reportPathTag) : "";
            String reportName = parameters.containsKey(Report.JASPERTITLE) ? (String) parameters.get(Report.JASPERTITLE) : "myReport";

            String path = getServletContext().getRealPath("/");
            path += jasperPath;

            JasperReport jasperReport = null;
            JasperDesign jasperDesign = null;
            jasperDesign = JRXmlLoader.load(path);

            logFilteringCard(parameters);

            jasperReport = JasperCompileManager.compileReport(jasperDesign);
            JasperPrint print = JasperFillManager.fillReport(jasperReport, parameters, con);
            JRHtmlExporter htmlExporter = new JRHtmlExporter();
            htmlExporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
            htmlExporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);            
            response.setContentType("text/html");
            PrintWriter pw = response.getWriter();
            htmlExporter.setParameter(JRExporterParameter.OUTPUT_WRITER, pw);
            htmlExporter.exportReport();
            con.close();

同时,在这行代码中:

Map parameters = Report.extractJasperParams(request.getParameterMap());

我设置了报告的所有参数,包括 LOGO_URL,并设置了属性值。

在我的情况下,我使用这种通用方法来生成我需要的所有报告。方法 Report.extractJasperParams 使用 request 的映射反映应该生成哪个报告,并相应地设置参数,但您可以根据自己的特定需求简化它。

方法 Configurator.getPoperties() 用于简化加载 Properties 文件(在我的情况下是一些加密值的文件)。


0

我也遇到了同样的问题,并通过新的Jasper API解决了这个问题。这里是相应的博客文章。通过在web.xml中使用ImageServlet配置,问题得以解决。


0

我认为标准解决方案是实现一种服务来提供您的图像。请参考随JasperReports提供的此示例:demo/samples/webapp

但是,如果您愿意传递参数,以便在HTML中使用Lazy Loading而不是PDF,则肯定也可以。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接