当前位置: 首页 > 知识库问答 >
问题:

使用JrimageLoader.LoadAwTimageFromBytes方法加载图像时获取错误

令狐阳秋
2023-03-14

我正在使用JasperSoft Studio 6.8.0,我遇到了一个困难的错误:

我的Java类有一个logo属性envparameter

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.fill.jrexpressionevalception为源文本计算表达式时出错:net.sf.jasperReports.engine.util.jrimageLoader.loadawtimageFrombytes($P{EnvParameter}.logo)在net.sf.jasperReports.engine.fill.jrevaluator.handleEvaluationException(.jrcalculator.evaluate(jrcalculator.java:672)在net.sf.jasperreports.engine.fill.jrcalculator.evaluate(jrcalculator.java:640)在net.sf.jasperreports.engine.fill.jrfillelement.evaluate(jrcalculator.java:640)在net.sf.jasperreports.engine.fill.jrfillelement.evaluateExpression(jrfillelement.javuateExpression(.java:383)在NET。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.jrverticalFiller.jillReport(jrverticalFiller.java:150)在fill.jrfillsubreport.fillsubreport.java:814)在net.sf.jasperreports.engine.fill.jrsubreportTrunnable.run(jrsubreportTrunnable.java:61)在net.sf.jasperreports.engine.fill.AbstractThreadSubreportTrunner.run(AbstractThreadSubreportTrunner.run(AbstractThreadSubreportTrunner.java:221)在45)原因:groovy.lang.MissingMethodException:方法没有签名:static net.sf.jasperreports.engine.util.jrimageLoader.loadAwtImageFromBytes()适用于参数类型:([b)值:[[-119,80,78,71,13,10,26,10,0,0,0,13,73,72,68,...]]可能的解决方案:在groovy.lang.MetaclasSimple.InvokEstaticMissingMethod(MetaclasSimple.java:1518)在groovy.lang.MetaclasSimple.InvokEstaticMethod(MetaclasSimple.java:1504)在e.java:52)在org.codehaus.groovy.runtime.callsite.callsite.defaultCall(callsitearray.java:47)在org.codehaus.groovy.runtime.callsite.abstractCallsite.call(abstractCallsite.java:116)在org.codehaus.groovy.runtime.callsite.abstractCallsite.call(abstractCallsite.java:116)在rptvtitolo_1558437271760_434544.revaluator.java:302)...17个公共帧省略了mag 21,2019年下午1:17:36 org.apache.catalina.core.standardwrappervalve调用

共有1个答案

穆鸿卓
2023-03-14

看来您使用了错误的方法来加载图像。JRImageLoader类在迁移到6.x版本的engine时发生了更改,并且在新版本的JasperReports中,这个类没有静态方法loadAwtImageFromBytes(Bytep[])(我相信在JR 5.5.0中有)。

你可以试试这个小例子。

用于测试的小Bean:

package ru.alex.model;

public class MyBean {

    private byte[] logo;

    public byte[] getLogo() {
        return logo;
    }

    public void setLogo(byte[] logo) {
        this.logo = logo;
    }
}
<?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>
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);
}

生成的报告如下所示:

 类似资料:
  • 我试图在JavaFX中实现一个非常简单的Raspberry Pi接口。我用的是一台电脑。基于fxml的布局和样式我的项目与css。我的问题是,尽管该应用程序在我的主计算机(从eclipse运行)上运行得很好,但它在Raspberry上也不工作,当我尝试在主计算机上运行导出的jar时也不工作。 我就是这样把纽扣剥皮的。当然,resources/images文件夹位于我的构建路径中。按钮的颜色与我在c

  • 我使用滑翔库来显示网格视图中的图像,但是在我的图像视图中显示了注释。 E/Glide:class com。邦普泰克。滑行负载发动机GlideException:无法加载资源 我的代码在使用位图时工作正常。这是我的密码:

  • 问题内容: 我完全意识到,无论是在SO还是离线状态下,这个问题在任何地方都被提出并得到了回答。但是,每次似乎都有不同的答案,例如this,this和that。 我不在乎是否在使用jQuery-重要的是它可以工作,并且是跨浏览器的。] 那么,预加载图像的最佳方法是什么? 问题答案: 不幸的是,这取决于您的目的。如果您打算将图像用于样式目的,则最好的选择是使用精灵。 但是,如果您打算使用标记中的图像,

  • 问题内容: 当有人通过我的应用程序工作时,我正在尝试在后台加载图像。我写的逻辑是这样的: 但是,当我尝试启动这样的新线程时: 但是在程序中我得到错误Looper.prepare必须被调用,随后是逻辑looper.quit() 但是,当我添加Looper.prepare()时,似乎中断了程序,并且没有要调用的looper.quit()。 我是否正确创建任务? 编辑: 这是我尝试运行时的错误日志: 我

  • 问题内容: 问题描述: 我正在创建一个滚动的带有缩略图的文章列表,该列表由我的SQLite数据库填充。通常,它运行缓慢,但速度较慢: 图像加载非常缓慢…我想使用“ 通用图像加载器 ”将图像缓存在设备上,如果您已经查看过图像(或者至少接近该图像,那会使它们看起来只是滚动到视图中) )。但是- 当您向上/向下拖动时,没有任何图像,然后在3-5秒后,图像开始弹出(就像重新下载它们一样) 我正在动态更改缩

  • 问题内容: 我正在从我的api加载json数据,其中包含指向我网域之外的图片的网址。我过去是这样做的,而不是使用Angular,而且我从未见过此问题… 在我的小提琴中,当我单击“搜索”时,出现了两个图像,但是它们都抛出了403禁止且未加载。 我不知道为什么会这样。有任何想法吗? 问题答案: 似乎imdb正在检查引荐来源网址,因此不允许其他方将其图像直接嵌入其网站中。如果您尝试使用其他域的图像,则可