润乾4.5的 qrcode 二维码实现函数

来源:互联网 发布:京东淘客软件 编辑:程序博客网 时间:2024/05/16 13:57

由于润乾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


原创粉丝点击