Получение ошибки в случае использования метода JRImageLoader.loadAwtImageFromBytes для загрузки изображения - PullRequest
0 голосов
/ 21 мая 2019

Я использую JasperSoft Studio 6.8.0, и у меня есть ошибка:

У меня есть logo свойство моего класса Java EnvParameter.

это свойствоbyte[]

Я передаю свой класс Java в Jasper Studio, поэтому я пытаюсь загрузить изображение внутри свойства логотипа следующим образом:

net.sf.jasperreports.engine.util.JRImageLoader.loadAwtImageFromBytes($P{EnvParameter}.logo)

РЕДАКТИРОВАТЬ

Я также пытался с

net.sf.jasperreports.engine.util.JRImageLoader.loadAwtImageFromBytes($P{EnvParameter}.getLogo())

Но у меня есть эта ошибка во время выполнения (скомпилируйте все нормально):

net.sf.jasperreports.engine.fill.JRExpressionEvalException: Ошибка при оценке выражения для исходного текста: net.sf.jasperreports.engine.util.JRImageLoader.loadAwtImageFromBytes ($ P {EnvParameter} .logo) в net.sf.jasperreports.engine.fill.JREvaluator.handleEREatorException.Java: 284) в net.sf.jasperreports.compilers.GroovyEvaluator.handleEvaluationException (GroovyEvaluator.java:98) в net.sf.jasperreports.engine.fill.JREvaluator.evaluate (JREvaluator.java:316) в net.sf.jasperreports..engine.fill.JRCalculator.evaluate (JRCalculator.java:672) на сайте net.sf.jasperreports.engine.fill.JRCalculator.evaluate (JRCalculator.java:640) в net.sf.jasperreports.engine.fill.JRFillElement.evaluateExpression (JRFillElement.java:1169) в net.sf.jasperreports.engine.fill.JF.valuImage (JRFillImage.java:466) в net.sf.jasperreports.engine.fill.JRFillImage.evaluate (JRFillImage.java:440) в net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate (JRFillElementCon3).в net.sf.jasperreports.engine.fill.JRFillBand.evaluate (JRFillBand.java:548) в net.sf.jasperreports.engine.fill.JRVerticalFiller.fillTitle (JRVerticalFiller.java:323) в net.sf.jasperreports.engine.fill..java: 414) по адресу net.sf.jasperreports.engine.fill.JRFillSubreport.fillSubreport (JRFillSubreport.java:814) по адресу net.sf.jasperreports.engine.fill.JRSubreportRunnable.run.(JRSubreportRunnable.java:61) в net.sf.jasperreports.engine.fill.AbstractThreadSubreportRunner.run (AbstractThreadSubreportRunner.java:221) в java.util.concurrent.ThreadPoolExecutor.runWorker (нить).concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) в java.lang.Thread.run (Thread.java:745) Причина: groovy.lang.MissingMethodException: Нет подписи метода: статический net.sf.jasperreports.engine.util.JRImageLoader.loadAwtImageFromBytes () применим для типов аргументов: ([B) значения: [[-119, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73,72, 68, ...]] Возможные решения: loadAwtImageFromBytes ([B) в groovy.lang.MetaClassImpl.invokeStaticMissingMethod (MetaClassImpl.java:1518) в groovy.lang.MetaClassImpl.invokeStaticMtahod150.tag.codehaus.groovy.runtime.callsite.StaticMetaClassSite.call (StaticMetaClassSite.java:52) в org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall (CallSiteArray.java:47) в org.codehaus.groovy..sf.jasperreports.engine.fill.JREvaluator.evaluate (JREvaluator.java:302) ... 17 общих кадров опущены mag 21, 2019 13:17:36 org.apache.catalina.core.StandardWrapperValve вызывают

1 Ответ

1 голос
/ 22 мая 2019

Что не так?

Похоже, вы используете неправильный метод для загрузки изображения.Класс 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);
}

Сгенерированный отчет выглядит так:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...