Что не так?
Похоже, вы используете неправильный метод для загрузки изображения.Класс JRImageLoader был изменен при переходе на 6.x версию движка и отсутствует статический метод loadAwtImageFromBytes (bytep[]) в этом классе в новых версиях JasperReports (я полагаю, что он был там в JR 5.5.0 ).
Рабочий пример
Вы можете попробовать этот небольшой пример.
Маленький компонент для тестирования:
package ru.alex.model;
public class MyBean {
private byte[] logo;
public byte[] getLogo() {
return logo;
}
public void setLogo(byte[] logo) {
this.logo = logo;
}
}
Шаблон ( jrxml file) очень прост (я использую JasperReports 6.4):
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="ImageExample" pageWidth="612" pageHeight="792" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<parameter name="mybean" class="ru.alex.model.MyBean" isForPrompting="false"/>
<title>
<band height="72">
<image>
<reportElement x="200" y="10" width="50" height="50"/>
<imageExpression><![CDATA[net.sf.jasperreports.engine.util.JRImageLoader.getInstance(DefaultJasperReportsContext.getInstance()).loadAwtImageFromBytes($P{mybean}.getLogo())]]></imageExpression>
</image>
</band>
</title>
</jasperReport>
Я использовал JRImageLoader.loadAwtImageFromBytes (byte []) метод для загрузки изображенияиз байтового массива.Как вы видите, нам нужно сначала получить экземпляр JRImageLoader - я использовал контекст по умолчанию, используя этот код: JRImageLoader.getInstance(DefaultJasperReportsContext.getInstance())
.
Код для создания отчета, как обычно, прост:
JasperReport jasperReport;
try (InputStream inputStream = JRLoader.getResourceInputStream("image.jrxml")) {
jasperReport = JasperCompileManager.compileReport(JRXmlLoader.load(inputStream));
}
Map<String, Object> params = new HashMap<>();
MyBean myBean = new MyBean();
File file = new File(getClass().getClassLoader().getResource("smile.jpg").getFile());
myBean.setLogo(Files.readAllBytes(file.toPath()));
params.put("mybean", myBean);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, new JREmptyDataSource());
SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration();
File outputFile = new File("output.pdf");
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
OutputStream fileOutputStream = new FileOutputStream(outputFile)) {
JRPdfExporter exporter = new JRPdfExporter();
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(byteArrayOutputStream));
exporter.setConfiguration(configuration);
exporter.exportReport();
byteArrayOutputStream.writeTo(fileOutputStream);
}
Сгенерированный отчет выглядит так: