项目要求的是使用chrome浏览器
最近手上项目要求实现打印功能,其中就要求将单号生成一维码,显示到前端并打印,下面为具体实现细节:如有说的不对的地方,希望指正!
一).首先将单号生成一维码,这里介绍两种:
1.
public class CodeScan {
static BASE64Encoder encoder = new sun.misc.BASE64Encoder();
public static void main(String[] paramArrayOfString) {
try {
// JBarcode localJBarcode = new JBarcode(EAN8Encoder.getInstance(), WidthCodedPainter.getInstance(), EAN8TextPainter.getInstance());//EAN8不支字母
JBarcode localJBarcode = new JBarcode(Code128Encoder.getInstance(),WidthCodedPainter.getInstance(), BaseLineTextPainter.getInstance());//code128
String str = "AA2219644";
BufferedImage localBufferedImage = localJBarcode.createBarcode(str);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
saveToJPEG(localBufferedImage, "EAN8.jpeg");
} catch (Exception localException) {
localException.printStackTrace();
}
}
static void saveToJPEG(BufferedImage paramBufferedImage, String paramString) {
saveToFile(paramBufferedImage, paramString, "jpeg");
}
static void saveToFile(BufferedImage paramBufferedImage, String paramString1, String paramString2) {
try {
FileOutputStream localFileOutputStream = new FileOutputStream("C:\\Users\\Administrator\\Desktop/" + paramString1);
ImageUtil.encodeAndWrite(paramBufferedImage, paramString2, localFileOutputStream, 500, 500);
localFileOutputStream.close();
} catch (Exception localException) {
localException.printStackTrace();
}
}
}
因为第一种是需要将图片保存下来,再传到前台,感觉太麻烦了,用完了以后还要删除,所以下就有第二种方法:
2.将bufferImage生成的图片利用ImageIo将内容写到ByteArrayoutOutputStream缓存中,在利用Base64Encoder将内容编码,下面为具体细节:
private JSONObject createBase64Image(JSONObject jsonObject, String number) throws InvalidAtributeException, IOException {
if(number == null || number.equals("")) return jsonObject;
BASE64Encoder encoder = new sun.misc.BASE64Encoder();
JBarcode localJBarcode = new JBarcode(Code128Encoder.getInstance(), WidthCodedPainter.getInstance(), BaseLineTextPainter.getInstance());
BufferedImage image = localJBarcode.createBarcode(number);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpeg", baos);
byte[] bytes = baos.toByteArray();
jsonObject.put("base64code", encoder.encodeBuffer(bytes).trim());
return jsonObject;
}
二:前端是Extjs,打印页面是html组成,
1.在测试的时候发现直接将上面第一种生成的图片路径设置为<img src=“路径”/>,前端显示不了;需要将图片放置在项目,比如web下有一个images文件夹用来放置图片,要显示的图片为"test.jpeg",那么 src的路径为 <img src="http://localhost/images/test.jpeg" />,这样的 话就能显示出来啦!如果没有显示请等上十来秒,然后重新点击打印预览
2.当然在这里需要注意的是如果图片格式为png,并且浏览器为chrome,有可能图片不能显示,需要在打印预览页面使用Alt+F9(将页面视图转换为web视图),这样的话是可以显示但是你不觉得太麻烦吗?下面介绍第三种显示方法:
3.将img标签的src变为http请求
<img id="imgVcode" src="http://localhost:8080/missioncreateCodeImage.action?number='+produceNumber+'" />
,向后台获取图片,注意这里不是获取路径而是图片内容,下面是后台获取请求并响应:
public String createCodeImage() {
try {
String number = getParamStr("number");
JBarcode localJBarcode = new JBarcode(Code128Encoder.getInstance(), WidthCodedPainter.getInstance(), BaseLineTextPainter.getInstance());
BufferedImage image = localJBarcode.createBarcode(number);
HttpServletResponse response = ServletActionContext.getResponse();
response.reset();
response.setContentType("image/jpeg");
OutputStream ops =
response.getOutputStream();
javax.imageio.ImageIO
.write(image, "jpeg", ops);
ops.close();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
这样获取的图片内容,在chrome中测试,居然不显示,后来又在其他浏览器中测试均正常,并且生成的图片加载速度相较于路径引用来说快的多;如果对浏览器没有什么要求的话可以使用这种方式,下面为第四种:
4.打印页面图片显示为
<img src="data:image/jpeg;base64,'+val.base64code+'" />
, 其中data:image/jpeg为图片格式,base64为编码格式;上面第一部分第二种生成图片方式就是将图片编码的代码
此Java代码sun.misc.BASE64Decoder这个包导入不进去的话,请将eclipse的Java运行环境修改成不是eclipse自带的jdk,换成本地1.7的jdk就OK了。