在开发二维码打印的过程中走过几次弯路,所以在这里特意将其记录下来留作备忘。一开始参考其他博主写的文章,有介绍通过编写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实现二维码生成及调用打印机打印相关推荐

  1. Java实现二维码生成

    title: Java实现二维码生成 categories: "Java" 前言 日前生活上存在很多扫描二维码的场景,支付.加好友-等操作都需要扫描二维码,然后我就在想Java能不 ...

  2. java实现二维码生成的几个方法

    java实现二维码生成的几个方法 分类: J2EE2013-06-13 20:32 10390人阅读 评论(1) 收藏 举报 1: 使用SwetakeQRCode在Java项目中生成二维码  http ...

  3. java实现二维码生成功能

    1.由来: 由于现在对二维码的使用比较多,正好我在项目里面也使用到了,所以写篇博客记录一下. 2.引入依赖: <dependency><groupId>com.google.z ...

  4. Java:二维码生成工具类

    java 二维码生成工具类 需要引入的maven <!--Java 生成二维码 --> <dependency><groupId>com.google.zxing& ...

  5. Java实现二维码生成与识别

    java实现QRCODE二维码的编码与解码实例 众所周知,爪哇,是一种神奇的编程语言,用JAVA 实现某一个功能,只是随便上网找一些对应的实现JAR包即可,于是,有了像JAR114这样专门提供给 爪哇 ...

  6. JAVA实现二维码生成加背景图

    应用场景:比如制作海报.宣传图时需要添加扫码关注的二维码 先上效果图 ( ≧▽≦ ) POM.XML <!-- 二维码生成 --><!-- https://mvnrepository ...

  7. 【Java】二维码生成,QRcode

    QRcode jar包下载地址:http://swetake.com/qrcode/java/qr_java.html 解析的工具可以参考 zxing 代码如下 package erweima; im ...

  8. Java实现二维码生成 Google-Zxing

    本篇文章将介绍java中如何生成二维码,二维码的展示主要包括两各方面:1.直接生成图片(直接生成图片不需要web程序,maven工程即可) 2.将二维码转为字节数组,然后在web页面显示.web项目的 ...

  9. zxing 二维码生成深度定制

    二维码生成服务之深度定制 之前写了一篇二维码服务定制的博文,现在则在之前的基础上,再进一步,花样的实现深度定制的需求,我们的目标是二维码上的一切都是可以由用户来随意指定 设计 1. 技术相关 zxin ...

最新文章

  1. 初级php工程师应该具备什么,一名合格的PHP工程师需要掌握的知识结构
  2. Java的设计模式 之 简单的工厂模式(一)
  3. php 串行化与json(转)--很不错的文章
  4. Xshell注册激活教程
  5. Android 设置客户端支持的TLS支持的版本号
  6. centos 文件搜索命令
  7. Java操作sqlite3数据库心得(一)
  8. 实验:ospf与BFD联动实验(EVE模拟器-Cisco)
  9. Oracle数据库精讲与疑难解析(第2版)
  10. UDF、UDAF、UDTF之间的区别
  11. [水晶报表]水晶报表数据库登陆问题
  12. Oracle——删除用户以及用户下数据
  13. 苹果手机怎样添加无线网服务器,如何让苹果手机网速提升三倍?
  14. 一文综述用于推荐系统的所有深度学习方法
  15. jmeter使用入门(+influxdb+grafana)
  16. *** stack smashing detected *** 是什么意思?怎么破
  17. 多媒体信息发布系统的独家优势
  18. PLC入门知识与行业应用普及
  19. Android12新特性——google()maven()等第三方添加
  20. java整型数有哪些_什么是整型数据有哪些分类

热门文章

  1. AI创业,是商机还是泡沫
  2. 增加博客访问量的 5 种方法
  3. Virtual Studio 2019 激活码
  4. pyecharts怎么绘制散点图_pyecharts数据可视化入门之3-——散点图
  5. Go语言自学系列 | golang标准库errors
  6. php之相似文章标题similar_text()函数使用
  7. Kickstarter定制OpenStack安装光盘脚本
  8. [WPF] PerformClick ?
  9. python画字符图片
  10. bootstrap-table:操作栏点击编辑按钮弹出模态框修改数据