由于润乾4.5默认没有二维码功能,需要用函数的方式实现。
准备库文件:
QR Code for Java ver. 0.50beta:http://www.swetake.com/qr/java/qr_java.html
或者直接下载:http://www.venus.dti.ne.jp/~swe/program/qrcode_java0.50beta10.tar.gz
编写二维码函数:
package runqian;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import com.runqian.report4.usermodel.Context;
import com.runqian.report4.model.expression.Expression;
import com.runqian.report4.model.expression.Function;
import com.runqian.report4.model.expression.Variant2;
import com.runqian.base4.util.ImageUtils;
import com.runqian.base4.util.ReportError;
import com.swetake.util.Qrcode;
/**
* 二维码QRCode函数.
*
* @author berry
*/
public class QRCodeTest extends Function {
/*
* (non-Javadoc)
*
* @see
* com.runqian.report4.model.expression.Node#calculate(com.runqian.report4
* .usermodel.Context, boolean)
*/
@Override
public Object calculate(Context arg0, boolean arg1) {
// 报表中调用该函数传递过来的参数列表
byte[] want = null;
if (this.paramList.size() == 0) {
throw new ReportError("二维码自定义函数参数列表为空");
}
// 取得计算表达式(得到传递给报表的参数)
Expression param1 = (Expression) this.paramList.get(0);
if (param1 == null) {
throw new ReportError("二维码自定义函数出现无效参数");
}
// 运算表达式,并取得运算结果(Object)
Object result1 = Variant2.getValue(param1.calculate(arg0, arg1), false,
arg1);
if (result1 == null)
return null;
if (result1 instanceof String) {
String str = result1.toString();
// 版本设为5
BufferedImage bi = CreateQrcode(str, 'M', 'B', 5, 4, 4);
try {
want = ImageUtils.writePNG(bi);
} catch (IOException e) {
e.printStackTrace();
}
}
return want;
}
/**
* 创建QRCode图形.
*
* @param data
* 二维码内容
* @param errorCorrection
* 纠错率,包括L(7%)、M(15%)、Q(25%)和H(30%),默认为M级
* @param encodeMode
* 编码模式,包括A、B、N,默认为B
* @param version
* 版本号,介于1-40。版本越高信息容量越大,默认可设为5<br/>
* 版本5,37*37模块,信息容量[L级:864;M级:688;Q级:496;H级:368]<br/>
* 更多可参考:http://www.qrcode.com/en/vertable1.html
* @param lineWidth
* 线宽,宽度越大图形越大,默认为4
* @param blankWidth
* 图形空白区宽度,应该设为线宽的倍数或0
* @return 图片
*/
public BufferedImage CreateQrcode(String data, char errorCorrection,
char encodeMode, Integer version, Integer lineWidth,
Integer blankWidth) {
Qrcode qrcode = new Qrcode();
// 纠错率,L, Q, H, M(默认)
qrcode.setQrcodeErrorCorrect(errorCorrection);
// 模式,A, N, B(默认)
qrcode.setQrcodeEncodeMode(encodeMode);
// 版本,1-40
qrcode.setQrcodeVersion(5);
BufferedImage bi = null;
Graphics2D g = null;
try {
byte[] d = data.getBytes("GB18030");
boolean[][] b = qrcode.calQrcode(d);
int qrcodeDataLength = b.length;
// 图形宽度
int imageLength = qrcodeDataLength * lineWidth + blankWidth * 2;
bi = new BufferedImage(imageLength, imageLength,
BufferedImage.TYPE_INT_RGB);
g = bi.createGraphics();
g.setBackground(Color.WHITE);
g.clearRect(0, 0, imageLength, imageLength);
g.setColor(Color.BLACK);
for (int i = 0; i < b.length; i++) {
for (int j = 0; j < b.length; j++) {
if (b[j][i]) {
g.fillRect(j * lineWidth + blankWidth, i * lineWidth
+ blankWidth, lineWidth, lineWidth);
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (g != null) {
g.dispose();
}
if (bi != null) {
bi.flush();
}
}
return bi;
}
}
在配置文件中加入函数定义
designer\web\WEB-INF\classes\config\customFunctions.properties
webapps\demo\WEB-INF\classes\config\customFunctions.properties
qrcode=0,runqian.QRCodeTest
模板中设置为图片字段,值为=qrcode(B1),如下图:
预览效果:
参考资料:
[1]润乾报表单元格显示二维码.http://www.cnblogs.com/javaReport/archive/2012/04/16/2452149.html
[2]使用 Java 生成二维码图像,解析二维码图像.http://blog.csdn.net/zklth/article/details/7191190