在JRDesignImage中添加图片字节数组(JasperReports 6.20)
解决JasperReport中直接使用图片字节数组的问题
你遇到的Base64字符串过长报错问题,根源是把字节数组转成超长文本作为表达式内容,超出了JasperReport的表达式长度限制。正确的做法是直接利用JasperReport对byte[]类型的原生支持,无需转码Base64,以下是两种可行方案:
方案一:直接绑定上下文内的字节数组变量
如果图片字节数组在报表设计阶段就能直接访问(比如当前方法内的变量),可以直接将表达式指向该字节数组:
byte[] image = new byte[]{0,0,0,0,0}; // 你的图片字节数组 JRDesignImage jrDesignImage = new JRDesignImage(); jrDesignImage.setX(width); jrDesignImage.setY(0); jrDesignImage.setWidth(width); jrDesignImage.setHeight(height); jrDesignImage.setOnErrorType(OnErrorTypeEnum.BLANK); // 创建字节数组类型的表达式 JRDesignExpression imageExpr = new JRDesignExpression(); imageExpr.setText("image"); // 直接引用当前上下文的字节数组变量名 imageExpr.setValueClass(byte[].class); jrDesignImage.setExpression(imageExpr);
这种方式跳过了Base64转码步骤,直接让JasperReport使用原始字节数组渲染图片,完全避免超长字符串问题。
方案二:通过报表参数动态传入字节数组(推荐)
如果图片字节数组是运行时动态生成的,更灵活的方式是将其作为报表参数传入:
1. 定义报表参数
// 创建字节数组类型的报表参数 JRDesignParameter imageParam = new JRDesignParameter(); imageParam.setName("reportImage"); imageParam.setValueClass(byte[].class); // 将参数添加到你的报表设计对象中 JRDesignReport reportDesign = new JRDesignReport(); // 替换为你的实际报表设计实例 reportDesign.addParameter(imageParam);
2. 绑定图片控件到参数
JRDesignImage jrDesignImage = new JRDesignImage(); jrDesignImage.setX(width); jrDesignImage.setY(0); jrDesignImage.setWidth(width); jrDesignImage.setHeight(height); jrDesignImage.setOnErrorType(OnErrorTypeEnum.BLANK); JRDesignExpression imageExpr = new JRDesignExpression(); imageExpr.setText("$P{reportImage}"); // 引用报表参数 imageExpr.setValueClass(byte[].class); jrDesignImage.setExpression(imageExpr);
3. 填充报表时传入参数
Map<String, Object> params = new HashMap<>(); params.put("reportImage", image); // image是你的图片字节数组 JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, new JREmptyDataSource());
这两种方案都适配你的Java 11.0.17、Grails 5.2.2及JasperReports API 6.20环境,无需依赖图片路径,也不会出现Base64超长字符串的报错。
内容的提问来源于stack exchange,提问作者Joao G. Hartmann
相关产品推荐
相关产品推荐

