我希望在我的页面上添加一个条形码,并能够预览它。条形码生成器是google.zxing,我的报表工具是iReport。
但是我不知道如何配置iReport中图像的Image Expression
和Expression Class
。
我希望在我的页面上添加一个条形码,并能够预览它。条形码生成器是google.zxing,我的报表工具是iReport。
但是我不知道如何配置iReport中图像的Image Expression
和Expression Class
。
package com.jaspersoft.alliances.mdahlman;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import net.sf.jasperreports.engine.JRDefaultScriptlet;
import net.sf.jasperreports.engine.JRScriptletException;
public class QRCodeScriptlet extends JRDefaultScriptlet {
public void afterDetailEval() throws JRScriptletException {
QRCodeWriter writer = new QRCodeWriter();
BitMatrix matrix = null;
try {
matrix = writer.encode(getFieldValue("barcode_text").toString(), BarcodeFormat.QR_CODE, 256, 256);
this.setVariableValue("BarCodeImage", MatrixToImageWriter.toBufferedImage(matrix) );
} catch (WriterException e) {
e.printStackTrace();
}
}
}
select 'some text' as barcode_text
。我只是为了强调我的脚本硬编码了字段名barcode_text
。(这很糟糕。)BarCodeImage
,类型为java.awt.image.BufferedImage
,计算为System
。这个名称也在脚本中硬编码了。(同样很糟糕。)$V{BarCodeImage}
。结果是在生成的JasperReport中看到一个快乐的QR码:
我记得看过一个更干净的示例,它实际上包括了一个不错的插件,因此您可以轻松地将此功能安装到iReport中,而不需要太多努力。如果我能找到它,那么我会更新此帖子。但在那之前,这至少涵盖了所有关键点。
图像表达式应该返回java.awt.Image
的任何子类。最简单的方法是使用自己的帮助程序类来生成Image。您可以创建一个静态方法,从String
生成条形码,并从IReport调用该方法。
在ZXing的情况下,我不知道要使用哪种方法,但我可以告诉您我使用的ImageExpression使用的是Barbecue库。
net.sourceforge.barbecue.BarcodeImageHandler.getImage(
MyBarcodeGenerator.getFromString($F{field})
MyBarcodeGenerator
类包含方法 getFromString(...)
,该方法返回一个 net.sourceforge.barbecue.Barcode
对象,在我的情况下是一个 net.sourceforge.barbecue.linear.code39.Code39Barcode
对象。
Expression Class
被忽略。
--编辑:
要在 zxing 中编码图像,您应该使用 MatrixToImageWriter
。
以下代码将 QRCode 编码为 BufferedImage,您可以在 Image Expression 字段中使用该对象:
MatrixToImageWriter.toBufferedImage(new QRCodeWriter().encode("BARCODE CONTENT", BarcodeFormat.QR_CODE, 400 /*Width*/, 400/*Height*/));
zxing
编写了一个答案,用于生成 QR 码。如果符合您的要求,您可以使用它。 - Kamal Singh