HTML src中报告jrxml内的JasperReport图像丢失了吗?

时间:2017-05-10 22:57:09

标签: java jasper-reports

我在Java中有一个方法,使用JasperReport以HTML格式导出报告:

public static byte[] exportToHtmlWithConn(String urlReport, Connection conn) throws JRException {

    Map<String, Object> parameters = new HashMap<>();

    String urlLogo = "/reports/image.PNG";

    String urlLogo2 = JasperUtilities.class.getResource(urlLogo).toString();

    parameters.put("CONTEXT", urlLogo2);

    JasperReport report = JasperCompileManager.compileReport(JasperUtilities.class.getResourceAsStream(urlReport));
    jasperPrint = JasperFillManager.fillReport(report, parameters, conn);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    HtmlExporter exporter = new HtmlExporter();
    exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
    exporter.setExporterOutput(new SimpleHtmlExporterOutput(baos));
    exporter.exportReport();

    return baos.toByteArray();
}

在报告中我有一个这样的参数:

<parameter name="CONTEXT" class="java.lang.String">
    <parameterDescription><![CDATA[CONTEXT]]></parameterDescription>
    <defaultValueExpression><![CDATA[0]]></defaultValueExpression>
</parameter>

这个想法是在报告中显示一个图像

<image>
    <reportElement x="180" y="-5" width="185" height="80" uuid="d8978cb8-9c4e-4d1b-83fb-a83356803128">
    <property name="com.jaspersoft.studio.unit.width" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.height" value="pixel"/>
    </reportElement>
    <imageExpression><![CDATA[$P{CONTEXT}.toString()]]></imageExpression>
</image>

问题是当我使用此方法导出HTML时图像丢失但是当我使用相同的结构导出PDF或xlsx时,图像工作正常。

为什么不使用HTML?当我检查html中的代码时,src是空的

<img src="" style="width: 185px" alt=""/>

有人可以帮忙解决这个问题吗?我已经看到很多方法可以做到这一点,但这是不可能的。我还使用了一个参数,如java.io.InputStream,图像以PDF和其他格式工作。但是在HTML中没有用。

此外,我使用过其他图像,但同样的问题。

2 个答案:

答案 0 :(得分:0)

HTML导出中的图像通常需要处理它们的处理程序。处理程序是net.sf.jasperreports.engine.export.HtmlResourceHandler的实现。

使用SimpleHtmlExporterOutput(java.io.OutputStream)时,默认情况下不会注册任何处理程序,因此输出。

使用基于文件的SimpleHtmlExporterOutput SimpleHtmlExporterOutput(java.io.File)SimpleHtmlExporterOutput(java.lang.String)及其风格时,默认情况下会注册图像处理程序。除了写入磁盘的HTML文件外,它还会写一个包含图像的文件夹(以_files结尾)。

根据您的处理方式,您可以注册:

  1. 如上所述模仿现有行为的net.sf.jasperreports.engine.export.FileHtmlResourceHandler

    HtmlExporter exporter = new HtmlExporter();
    exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
    
    SimpleHtmlExporterOutput htmlExporterOutput = new SimpleHtmlExporterOutput(baos);
    htmlExporterOutput.setImageHandler(new FileHtmlResourceHandler(new File("html_images"), "html_images/{0}"));
    
    exporter.setExporterOutput(htmlExporterOutput);
    exporter.exportReport();
    

    这将创建包含报告中图片的html_images文件夹,并将HTML <img>指向它们。您将看到它们的名称与原始名称不同。这是因为完成了一些内部映射,每个图像名称都包含jasperPrint中的实际位置。

  2. net.sf.jasperreports.web.util.WebHtmlResourceHandler提供自定义处理,例如通过servlet提供图像。

    HtmlExporter exporter = new HtmlExporter();
    exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
    
    SimpleHtmlExporterOutput htmlOutput = new SimpleHtmlExporterOutput(baos);
    htmlOutput.setImageHandler(new WebHtmlResourceHandler("http://myserver/images?image={0}"));
    
    exporter.setExporterOutput(htmlOutput);
    exporter.exportReport();
    

    在这种情况下,图像处理有点复杂,涉及从jasperPrint检索图像,类似于ImageWebResourceHandler的图像。

答案 1 :(得分:0)

这是我的解决方案:

我需要以PDF格式导出xlsx并以HTML格式显示报告。每种方法都有一种方法。但我遇到了HTML图像缺失的问题。但是,感谢 Narcis 的解决方案是这样的:

public static byte[] exportToHtmlWithConn(String urlReport, Connection conn) throws JRException {

    Map<String, Object> parameters = new HashMap<>();

    parameters = returnLogoPutAsParam();

    JasperReport report = JasperCompileManager.compileReport(JasperUtilities.class.getResourceAsStream(urlReport));
    jasperPrint = JasperFillManager.fillReport(report, parameters, conn);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    HtmlExporter exporter = new HtmlExporter();
    exporter.setExporterInput(new SimpleExporterInput(jasperPrint));

    SimpleHtmlExporterOutput htmlExporterOutput = new SimpleHtmlExporterOutput(baos);
    htmlExporterOutput.setImageHandler(new FileHtmlResourceHandler(new File("html_images"), "/web/resources/images/logo.png"));

    exporter.setExporterOutput(htmlExporterOutput);
    exporter.exportReport();

    return baos.toByteArray();
}

在这部分htmlExporterOutput.setImageHandler(new FileHtmlResourceHandler(new File("html_images"), "/web/resources/images/logo.png"));中,我将logo.png放在我前端资源的一个文件夹中。

我使用方法returnLogoPutAsParam();返回PDF和xlsx

的图像
public static Map<String, Object> returnLogoPutAsParam() {
    Map<String, Object> parameters = new HashMap<>();
    InputStream logo = returnLogoByte();
    parameters.put("logo", logo);
    return parameters;
}

最后这个:

public static InputStream returnLogoByte() {
    InputStream is = null;
    try {
        byte[] imageByteArray;
        BufferedImage img = ImageIO.read(JasperUtilities.class.getResourceAsStream("/reports/logo.png"));
        ByteArrayOutputStream bas = new ByteArrayOutputStream();
        ImageIO.write(img, "bmp", bas);
        imageByteArray = bas.toByteArray();
        System.out.println("Byte[] logo:" + imageByteArray.length);
        is = new ByteArrayInputStream(imageByteArray);
        return is;
    } catch (Exception e) {
        System.out.println("Error reading logo.");
        e.printStackTrace();
    }
    return is;
}

我真的不确定这是否是最佳解决方案,但它适用于一张图片。

我希望这些信息对某人有帮助。

干杯。