【问题标题】:JasperReport image inside report jrxml on HTML src is missing?缺少 HTML src 上的报告 jrxml 中的 JasperReport 图像?
【发布时间】:2017-05-10 22:57:09
【问题描述】:

我有一个 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 中不起作用。

我也使用过其他图片,但同样的问题。

【问题讨论】:

标签: java jasper-reports


【解决方案1】:

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 &lt;img&gt;s 指向它们。您会看到它们的名称与原始名称不同。这是因为做了一些内部映射,每个图像名称都包含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 所做的事情。

【讨论】:

  • 亲爱的 Narcis 非常感谢!真的是你拯救了我的一天!它工作完美......
【解决方案2】:

这是我的解决方案:

我需要以 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;
}

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

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

干杯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多