由于润乾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)*/@Overridepublic 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();// 版本设为5BufferedImage 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-40qrcode.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