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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值