google.zxing 条形码生成器 in iReport
我想在我的页面中放置条形码并可以预览它。条形码生成器是google.zxing,我的报告工具是iReport。
但我不知道,如何在iReport中配置和图像。Image Expression
Expression Class
我想在我的页面中放置条形码并可以预览它。条形码生成器是google.zxing,我的报告工具是iReport。
但我不知道,如何在iReport中配置和图像。Image Expression
Expression Class
两个关键思想是首先编写一些Java代码来创建相关的图像,然后设计报表以适当地引用此代码。也许生成图像的最简单方法是在像这样的脚本中:
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中,而无需付出任何努力。如果我能追踪到这一点,那么我会更新这篇文章。但在此之前,这至少涵盖了所有关键点。
图像表达式应返回 的任何子类。实现此目的的最简单方法是使用您自己的帮助程序类来生成 Image。您可以创建一个静态方法,该方法从 生成条形码,并从 IReport 调用该方法。java.awt.Image
String
在ZXing的情况下,我不知道要使用的方法,但我可以使用Grill库来判断我用作ImageExpression的内容。
net.sourceforge.barbecue.BarcodeImageHandler.getImage(
MyBarcodeGenerator.getFromString($F{field})
MyBarcodeGenerator
类包含在我的案例中返回 a 的方法getFromString(...)
net.sourceforge.barbecue.Barcode
net.sourceforge.barbecue.linear.code39.Code39Barcode
将被忽略。Expression Class
--已编辑:
要在zxing中对图像进行编码,您应该使用MatrixToImageWriter
以下代码将 QRCode 编码为可在“图像表达式”字段中使用的缓冲图像:
MatrixToImageWriter.toBufferedImage(new QRCodeWriter().encode("BARCODE CONTENT", BarcodeFormat.QR_CODE, 400 /*Width*/, 400/*Height*/));