java实现二维码生成及调用打印机打印
在开发二维码打印的过程中走过几次弯路,所以在这里特意将其记录下来留作备忘。一开始参考其他博主写的文章,有介绍通过编写JAVA后台代码来获取本地默认打印机的驱动实现打印。BUT!这样就导致在本地开发测试时看似一切正常,一旦项目部署到linux环境下,就会完全失效了(JAVA后台代码去获取linux本地的打印机驱动)。还有介绍并提供编写的插件的(不甚了解这块),鉴于时间要求比较苛刻,那就简单的来吧。
需求:生成带水印效果的二维码图片,可以批量预览,并连接打印机批量打印。
开发思路:
1.编写二维码生成工具类,实现二维码图片的生成
2.提供二维码打印前的预览
3.通过隐藏的iframe实现打印(简单粗暴)
以下是自己编写的一个小案例,可以直接运行测试,并提供了code下载。如果有其它更好的实现方式,也希望大家多提出宝贵的意见。
一、项目结构
-
二、主要CODE
1.MyQRUtils.java 二维码工具类
1 packagecom.webprint.qr.tools;2 3 importjava.awt.Color;4 importjava.awt.Font;5 importjava.awt.Graphics2D;6 importjava.awt.image.BufferedImage;7 importjava.io.File;8 importjava.io.IOException;9 importjava.io.OutputStream;10 importjava.util.Hashtable;11 12 importjavax.imageio.ImageIO;13 14 importorg.apache.commons.logging.Log;15 importorg.apache.commons.logging.LogFactory;16 17 importcom.google.zxing.BarcodeFormat;18 importcom.google.zxing.EncodeHintType;19 importcom.google.zxing.MultiFormatWriter;20 importcom.google.zxing.WriterException;21 importcom.google.zxing.common.BitMatrix;22 importcom.google.zxing.qrcode.decoder.ErrorCorrectionLevel;23 24 public classMyQRUtils{25 26 private static final Log logger = LogFactory.getLog(MyQRUtils.class);27 28 private static final int BLACK = 0xFF000000;29 private static final int WHITE = 0xFFFFFFFF;30 private static final int LogoPart = 4;31 32 /** 33 * 生成二维码前的配置信息34 *@paramcontent 生成二维码图片内容35 *@paramwidth 二维码图片的宽度36 *@paramheight 二维码图片的高度37 *@return 38 */ 39 public static BitMatrix setBitMatrix(String content,int width,intheight){40 Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();41 hints.put(EncodeHintType.CHARACTER_SET, "utf-8");42 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); //指定纠错等级 43 BitMatrix bitMatrix=null;44 try{45 bitMatrix = newMultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);46 } catch(WriterException e) {47 logger.error("生成二维码错误",e);48 }49 returnbitMatrix;50 }51 52 /** 53 * 将LOGO图片放在二维码中间(水印效果)54 * 将生成的图片以流的形式输出到页面展示55 *@parammatrix BitMatrix56 *@paramformat 图片格式57 *@paramoutStream 输出流58 *@paramlogoPath LOGO地址59 *@paramshowBottomText 二维码图片底部需要显示的问题60 *@throwsIOException61 */ 62 public static void megerToFile(BitMatrix matrix,String format,OutputStream outStream,String logoPath,String showBottomText) throwsIOException {63 BufferedImage image =toBufferedImage(matrix);64 Graphics2D gs =image.createGraphics();65 66 //1.加入LOGO水印效果 67 if(null != logoPath && !"".equals(logoPath)){68 //1.1 载入LOGO图片 69 BufferedImage logoImg = ImageIO.read(newFile(logoPath));70 //1.2 考虑到LOGO图片贴到二维码中,建议大小不要超过二维码的1/5; 71 int width = image.getWidth() /LogoPart;72 int height = image.getHeight() /LogoPart;73 //1.3 LOGO居中显示 74 int x = (image.getWidth() - width) / 2;75 int y = (image.getHeight() - height) / 2;76 gs.drawImage(logoImg, x, y, logoImg.getWidth(), logoImg.getHeight(), null);77 logoImg.flush();78 }79 //2.二维码图片底部插入文字 80 if(null != showBottomText && !"".equals(showBottomText)){81 //2.1 设置字体样式 82 Font font = new Font("微软雅黑", Font.PLAIN, 14);83 gs.setColor(Color.BLACK);84 gs.setFont(font);85 //2.2 字体显示位置 86 int x = (image.getWidth() - getWatermarkLength(showBottomText, gs))/2;87 int y = image.getHeight()-2;88 gs.drawString(showBottomText, x, y);89 }90 gs.dispose();91 ImageIO.write(image, format, outStream);92 }93 94 /** 95 * 将LOGO图片放在二维码中间(水印效果)96 * 将生成的图片生成到本地硬盘路径下97 *@parammatrix BitMatrix98 *@paramformat 图片格式99 *@paramimagePath 图片存放路径100 *@paramlogoPath LOGO地址101 *@paramshowBottomText 二维码图片底部需要显示的问题102 *@throwsIOException103 */ 104 public static void megerToFile2(BitMatrix matrix,String format,String imagePath,String logoPath,String showBottomText) throwsIOException {105 BufferedImage image =toBufferedImage(matrix);106 Graphics2D gs =image.createGraphics();107 108 //1.加入LOGO水印效果 109 if(null != logoPath && !"".equals(logoPath)){110 BufferedImage logoImg = ImageIO.read(newFile(logoPath));111 int width = image.getWidth() /LogoPart;112 int height = image.getHeight() /LogoPart;113 int x = (image.getWidth() - width) / 2;114 int y = (image.getHeight() - height) / 2;115 gs.drawImage(logoImg, x, y, logoImg.getWidth(), logoImg.getHeight(), null);116 logoImg.flush();117 }118 119 //2.二维码图片底部插入文字 120 if(null != showBottomText && !"".equals(showBottomText)){121 //2.1 设置字体样式 122 Font font = new Font("微软雅黑", Font.PLAIN, 14);123 gs.setColor(Color.BLACK);124 gs.setFont(font);125 //2.2 字体显示位置 126 int x = (image.getWidth() - getWatermarkLength(showBottomText, gs))/2;127 int y = image.getHeight()-2;128 gs.drawString(showBottomText, x, y);129 }130 gs.dispose();131 ImageIO.write(image, format, newFile(imagePath));132 }133 134 /** 135 * 获取水印字体的长度136 *@paramfontString137 *@paramgs138 *@return 139 */ 140 public static intgetWatermarkLength(String fontString,Graphics2D gs){141 return gs.getFontMetrics(gs.getFont()).charsWidth(fontString.toCharArray(),0,fontString.length());142 }143 144 public staticBufferedImage toBufferedImage(BitMatrix matrix){145 int width =matrix.getWidth();146 int height =matrix.getHeight();147 BufferedImage image = newBufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);148 149 for(int x=0;x<width;x++){150 for(int y=0;y<height;y++){151 image.setRGB(x, y, matrix.get(x, y) ?BLACK : WHITE);152 }153 }154 returnimage;155 }156 }
说明:二维码实现方式有多种,此处代码可根据具体需求具体开发。
2.WebPrintController.java SpringMVC的controller层代码
1 packagecom.webprint.qr.controller;2 3 importjava.io.IOException;4 importjava.io.OutputStream;5 importjava.util.ArrayList;6 importjava.util.HashMap;7 importjava.util.List;8 importjava.util.Map;9 10 importjavax.servlet.http.HttpServletRequest;11 importjavax.servlet.http.HttpServletResponse;12 13 importorg.apache.commons.logging.Log;14 importorg.apache.commons.logging.LogFactory;15 importorg.springframework.stereotype.Controller;16 importorg.springframework.ui.Model;17 importorg.springframework.web.bind.annotation.RequestMapping;18 19 importcom.google.zxing.common.BitMatrix;20 importcom.webprint.qr.tools.MyQRUtils;21 22 @Controller("WebPrintController")23 @RequestMapping("/qrPrint")24 public classWebPrintController {25 26 private static final Log logger = LogFactory.getLog(MyQRUtils.class);27 28 /** 29 * 二维码预览页面30 *@parammodel31 *@return 32 */ 33 @RequestMapping("/showList.do")34 publicString showQRList(Model model){35 //模拟获取数据库数据 36 List listData = newArrayList();37 StringBuffer ids = newStringBuffer();38 String code = "print00";39 for (int i = 0; i < 3; i++) {40 Map<String,String> map = new HashMap<String,String>(); //模拟VO 41 map.put("id",code+""+i);42 ids.append(code+""+i).append(",");43 listData.add(map);44 }45 model.addAttribute("showListData", listData);46 model.addAttribute("ids", ids);47 return "showQR";48 }49 50 /** 51 * 二维码打印页面52 * 隐藏在iframe中53 *@parammodel54 *@return 55 */ 56 @RequestMapping("/printEWM.do")57 publicString printQRFrame(Model model,HttpServletRequest request){58 String ids = request.getParameter("ids");59 model.addAttribute("ids", ids);60 return "printFrameQR";61 }62 63 /** 64 * 显示二维码图片65 *@paramrequest66 *@paramresponse67 *@throwsException68 */ 69 @RequestMapping("/showEWMImage.do")70 public voidshowImageByType(HttpServletRequest request,HttpServletResponse response){71 String id = request.getParameter("showID"); //ID72 73 //此处可从数据库中获取内容 74 String content ="打印二维码\n打印测试\nID:"+id;75 76 OutputStream outStream = null;77 try{78 outStream =response.getOutputStream();79 String format = "jpg";80 String bottomText = "一路不停"; //水印文字 81 82 BitMatrix bitMatrix = MyQRUtils.setBitMatrix(content, 180 , 180);83 //暂时不使用LOGO图片 84 MyQRUtils.megerToFile(bitMatrix, format, outStream, null,bottomText);85 86 } catch(Exception e) {87 logger.error("二维码生成失败", e);88 }finally{89 try{90 if(outStream!=null){91 outStream.flush();92 outStream.close();93 }94 } catch(IOException e) {95 logger.error("关闭数据流失败", e);96 }97 98 }99 }100 101 102 }
说明:二维码图片的展示及其打印以流的方式操作,这样就无需将图片保存在服务器上了。
3.index.jsp 首页
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 3 <html> 4 <head> 5 <meta http-equiv="pragma" content="no-cache"> 6 <meta http-equiv="cache-control" content="no-cache"> 7 <meta http-equiv="expires" content="0"> 8 <%@include file="/include.jsp" %> 9 <title></title> 10 </head> 11 <iframe id="iframePrintEWM" frameborder="0" width="0" height="0"></iframe> 12 <body> 13 <div> 1.二维码预览</br> 14 2.二维码打印15 </div></br> 16 </br></br> 17 <hr> 18 </br> 19 <input type="button" id ="showQRList" name="showQRList" value="二维码预览" οnclick="showQRList()"/> 20 <div id='divDialog'></div> 21 <div id='divPrintDialog'></div> 22 </body> 23 <script type="text/javascript"> 24 var height = $("body").height();25 var width = $("body").width();26 27 //二维码预览 28 function showQRList(){29 var url ="${rootPath}/qrPrint/showList.do";30 $("#divDialog").dialog({31 title:"预览",32 width:260,33 height:500,34 top:(height-500)/2,35 left:(width-260)/2,36 href:url,37 cache:false,38 closed:false,39 modal:true 40 });41 }42 43 //二维码打印 44 function printEWM(ids){45 $('#divDialog').window('close');46 var url = '${rootPath}/qrPrint/printEWM.do?ids='+ids;47 $('#iframePrintEWM').attr("src", url);48 }49 </script> 50 </html>
说明:将iframe放在body标签外,并将其宽高和border都设置为0,达到隐藏的效果。
4.showQR.jsp 二维码预览页
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <html> 3 <head> 4 <%@include file="/include.jsp" %> 5 <title>showQRList</title> 6 </head> 7 <body> 8 <div > 9 <div align="left" > 10 <a href="javascript:printEWM('${ids }');" class="easyui-linkbutton" iconCls="icon-printer" style="width: 95px">二维码打印</a> 11 </div> 12 </div> 13 <div> 14 <c:forEach var="printID" items="${showListData}" varStatus="lis"> 15 <table align="center" class="codetable" cellpadding="0" style="float: left;border:1px solid #333333;"> 16 <tr> 17 <td align="center"> 18 <div id="bcTarget${lis.index }"> 19 <img src="${rootPath}/qrPrint/showEWMImage.do?showID=${printID.id}"> 20 </div> 21 </td> 22 </tr> 23 </table> 24 </c:forEach> 25 </div> 26 </body> 27 </html>
说明:如果项目中不需要自定义预览,此处代码可以去掉。
5.printFrameQR.jsp 隐藏的iframe页,用于打印(非常简单,非常强大)
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <html> 3 <head> 4 <%@include file="/include.jsp" %> 5 <title>printFrameQR</title> 6 </head> 7 <body οnlοad="this.focus();this.print()"> 8 <div> 9 <c:forEach var="printID" items="${ids}" varStatus="lis"> 10 <div id="bcTarget${lis.index }"> 11 <img src="${rootPath}/qrPrint/showEWMImage.do?showID=${printID}"> 12 </div></br> 13 </c:forEach> 14 </div> 15 </body> 16 </html>
说明:简单粗暴的方式,打印的关键就在于body标签中的 οnlοad="this.focus();this.print()"
三、预览效果
注意对IE打印页面的设置;
四、code下载部署说明
以上是周末自己编写的小案例,供大家参考。
环境:myeclipse8.5 + tomcat6 + jdk7 +jQuery EasyUI + core-3.3.0.jar(google zxing)
地址:http://download.csdn.net/detail/onepersontz/9794722
转载于:https://www.cnblogs.com/c2013/p/10249200.html
java实现二维码生成及调用打印机打印相关推荐
- Java实现二维码生成
title: Java实现二维码生成 categories: "Java" 前言 日前生活上存在很多扫描二维码的场景,支付.加好友-等操作都需要扫描二维码,然后我就在想Java能不 ...
- java实现二维码生成的几个方法
java实现二维码生成的几个方法 分类: J2EE2013-06-13 20:32 10390人阅读 评论(1) 收藏 举报 1: 使用SwetakeQRCode在Java项目中生成二维码 http ...
- java实现二维码生成功能
1.由来: 由于现在对二维码的使用比较多,正好我在项目里面也使用到了,所以写篇博客记录一下. 2.引入依赖: <dependency><groupId>com.google.z ...
- Java:二维码生成工具类
java 二维码生成工具类 需要引入的maven <!--Java 生成二维码 --> <dependency><groupId>com.google.zxing& ...
- Java实现二维码生成与识别
java实现QRCODE二维码的编码与解码实例 众所周知,爪哇,是一种神奇的编程语言,用JAVA 实现某一个功能,只是随便上网找一些对应的实现JAR包即可,于是,有了像JAR114这样专门提供给 爪哇 ...
- JAVA实现二维码生成加背景图
应用场景:比如制作海报.宣传图时需要添加扫码关注的二维码 先上效果图 ( ≧▽≦ ) POM.XML <!-- 二维码生成 --><!-- https://mvnrepository ...
- 【Java】二维码生成,QRcode
QRcode jar包下载地址:http://swetake.com/qrcode/java/qr_java.html 解析的工具可以参考 zxing 代码如下 package erweima; im ...
- Java实现二维码生成 Google-Zxing
本篇文章将介绍java中如何生成二维码,二维码的展示主要包括两各方面:1.直接生成图片(直接生成图片不需要web程序,maven工程即可) 2.将二维码转为字节数组,然后在web页面显示.web项目的 ...
- zxing 二维码生成深度定制
二维码生成服务之深度定制 之前写了一篇二维码服务定制的博文,现在则在之前的基础上,再进一步,花样的实现深度定制的需求,我们的目标是二维码上的一切都是可以由用户来随意指定 设计 1. 技术相关 zxin ...
最新文章
- 初级php工程师应该具备什么,一名合格的PHP工程师需要掌握的知识结构
- Java的设计模式 之 简单的工厂模式(一)
- php 串行化与json(转)--很不错的文章
- Xshell注册激活教程
- Android 设置客户端支持的TLS支持的版本号
- centos 文件搜索命令
- Java操作sqlite3数据库心得(一)
- 实验:ospf与BFD联动实验(EVE模拟器-Cisco)
- Oracle数据库精讲与疑难解析(第2版)
- UDF、UDAF、UDTF之间的区别
- [水晶报表]水晶报表数据库登陆问题
- Oracle——删除用户以及用户下数据
- 苹果手机怎样添加无线网服务器,如何让苹果手机网速提升三倍?
- 一文综述用于推荐系统的所有深度学习方法
- jmeter使用入门(+influxdb+grafana)
- *** stack smashing detected *** 是什么意思?怎么破
- 多媒体信息发布系统的独家优势
- PLC入门知识与行业应用普及
- Android12新特性——google()maven()等第三方添加
- java整型数有哪些_什么是整型数据有哪些分类