前几天做项目的时候遇到一个需求,客户想在医院的诊间结算单上打印出二维码,供病人去扫描。由于现有的版本项目报表显示和打印都是用ireport 3.7来做的,还没转化成lodop打印(新版本是lodop 在那上面打印二维码轻而易举)。 原本以前打印过条形码,想着应该差不多。于是就着手做了,但是做的时候发现,ireport 的组件面板上根本没有 二维码的样式,只有条形码。
这下懵逼了,总不能因为这样一个小需求还要把打印格式全部转化为lodop,而且还得去每个诊间医生的电脑上一个个去安装lodop吧。那只能在原有的方式上想办法了。
看到组件模板上有image ,突然有个想法。能不能在后台生成好图片,把这个图片给给到ireport呢?由于用的是java,和报表之间是通过jasperReports 去实现,于是从网上搜索了一堆发现都是在ireport 中引入javase.jar 和core.jar 包 然后再
新建一个【Image】属性的文本,选择图片路径时选择“取消”,这时候在“image Expression”框中添加“com.google.zxing.client.j2se.MatrixToImageWriter.toBufferedImage(new com.google.zxing.qrcode.QRCodeWriter().encode($P{QrCode},com.google.zxing.BarcodeFormat.QR_CODE,1000,1000))”字段。
其中:$P{QrCode}是二维码的内容,这个参数可以根据自己的实际情况来定
但是其实这种方法是有缺陷的!!!比如我现在遇到的情况:客户又要求在二维码中间加入自己医院的logo (没办法,需求一直变是经常有的事情。。。。在这里就不吐槽了)。本着客户是上帝的原则 咱必须得咬咬牙满足到底啊。
下面,正式进入解决方法:
-
在ireport的Parameters里面新增一个参数,这里我们取名:QRCODEURL。(这一步很重要!!)·
2.image 拖入要放二维码的地方
3.设置 image的 expression 属性,选中新加的QRCODEURL (这个一定要注意,不能在Image Expression里面直接设置$P{QRCODEURL},否则会报net.sf.jasperreports.engine.design.JRValidationException: Report design not valid :
1. Parameter not found QRCODEURL的错误) ,并且在 is Lazy 打上勾(懒汉模式加载)
4.开始写后台。
如果是一张固定的二维码图片,建议直接引入生成好的二维码图片的路径就可以了,我这边是根目录下。
5.如果是动态的二维码,可以有两种方式去实现。
5.1 先生成一张图片 保存到服务器上。然后传给前台地址去调用。
关于如何生成图片的代码我贴在下面。需要core-2.2.jar,javase-2.2.jar 这两个jar 包
package com.bsoft.bsphis.msxzz;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import jav