我在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中没有用。
此外,我使用过其他图像,但同样的问题。
答案 0 :(得分:0)
HTML导出中的图像通常需要处理它们的处理程序。处理程序是net.sf.jasperreports.engine.export.HtmlResourceHandler
的实现。
使用SimpleHtmlExporterOutput(java.io.OutputStream)
时,默认情况下不会注册任何处理程序,因此输出。
使用基于文件的SimpleHtmlExporterOutput
SimpleHtmlExporterOutput(java.io.File)
或SimpleHtmlExporterOutput(java.lang.String)
及其风格时,默认情况下会注册图像处理程序。除了写入磁盘的HTML文件外,它还会写一个包含图像的文件夹(以_files结尾)。
根据您的处理方式,您可以注册:
如上所述模仿现有行为的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
中的实际位置。
或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;
}
我真的不确定这是否是最佳解决方案,但它适用于一张图片。
我希望这些信息对某人有帮助。
干杯。