网页生成二维码并实现打印的两种方式

来源:由于公司产品功能需要,要在客户回执上增加打印二维码,而用户使用的电脑甚至还有IE8的浏览器,根据工作的总结,记录下使用的两种二维码实现方式的方案,供以后参考。


  • 方案1:使用jquery-qrcode.js插件,在页面生成可打印的二维码(经过测试,该方案不能完全支持IE8)

qrcode的渲染方式render中的Canvas是html5的东西,所以会有兼容性问题,为了实现IE8的兼容,我使用了table方式渲染,的确可以在页面上显示出二维码,但是在打印的时候却不能打印出来,table也不能转换成png图片。所以,这个方案只适合支持canvas的浏览器打印二维码。

<script language="javascript">
    $(function(){
    //页面上每一个name='controlQrcode'的div都加上二维码  
    $("div[name='controlQrcode']").each(function(index,element){
            createControlQrcode(element);
        })
    });

    //生成办件二维码
    function createControlQrcode(obj){
        var qrcode = $(obj).qrcode({
            render: canvas, // 渲染方式有table方式(IE兼容)和canvas方式,默认是canvas
            text: '二维码里面的内容',
            width: 81,//宽度
            height: 81,//高度
            colorDark : '#000000',
            colorLight : '#ffffff',
            correctLevel:3//二维码纠错级别
        });
        var canvas = $(obj).children("canvas");
        //将canvas转换成png图片,才能被打印机识别打印
        var img = canvas[0].toDataURL("image/png")
        $(obj).html("<img src='" + img + "'>")
    }
</script>

更多详细资料参考:http://blog.csdn.net/gao36951/article/details/48736329

以上方法基本能满足目前大部分浏览器打印二维码的需求,但是如果一定要在IE8上实现二维码的打印,可以参考下面的方案二。

  • 方案二:后台生成二维码图片传到页面显示并实现打印。
需要在maven引入两个jar包
<!-- 条形码、二维码生成 -->
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>2.2</version>
</dependency>
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>2.2</version>
</dependency>

工具类QrCodeUtils.java:

package com.minstone.apprControl.system.util;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Hashtable;

import javax.imageio.ImageIO;

import sun.misc.BASE64Encoder;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;

/**
 * 二维码生成工具类
 * @author ChenDongWei
 * @date 2017年12月27日下午4:16:33
 */
public class QrCodeUtils {
    /**
     * creatRrCode:(这里用一句话描述这个方法的作用). <br/> 
     * @author ChenDongWei
     * @date 2017年12月27日下午5:05:19
     * @param contents 二维码的内容
     * @param width 二维码图片宽度
     * @param height 二维码图片高度
     * @return
     */
    public static String creatRrCode(String contents, int width, int height){
        String binary = null;
        Hashtable hints= new Hashtable();   
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");  
        try {
            BitMatrix bitMatrix = new MultiFormatWriter().encode(
                    contents,BarcodeFormat.QR_CODE, width, height, hints);
            // 1、读取文件转换为字节数组
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            BufferedImage image = toBufferedImage(bitMatrix);
            //转换成png格式的IO流
            ImageIO.write(image, "png", out);
            byte[] bytes = out.toByteArray();

            // 2、将字节数组转为二进制
            BASE64Encoder encoder = new BASE64Encoder(); 
            binary = encoder.encodeBuffer(bytes).trim();
        } catch (WriterException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        return binary;
    }

    /**
     * image流数据处理
     * @author ChenDongWei
     * @date 2017年12月27日下午4:16:33
     */
    public static BufferedImage toBufferedImage(BitMatrix matrix) {
        int width = matrix.getWidth();
        int height = matrix.getHeight();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        for (int x = 0; x < width; x++) {
          for (int y = 0; y < height; y++) {
            image.setRGB(x, y, matrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
          }
        }
        return image;
      }
}

controller代码:

String binary = QrCodeUtils.creatRrCode("二维码内容", 150,150);
modelAndView.addObject("binary", binary);//将二维码传到页面

页面jsp代码:

<div name="controlQrcode" style="float: left;"><img src="data:image/png;base64,${binary }"></div>

至此,方案二实现完成。

以上两种二维码打印的实现方案,仅是个人在工作中遇到的案例,仅供参考。如有错误,请留言指正。
二维码,条形码,网页各类打印样式控件Lodop 1.如何在页面内嵌入控件见样例一 2.如何选材打印当前页面内容见样例二 3.如何用代码生成打印页见样例三 4.如何打印设计和定位套打见样例四 5.如何控制纸张大小和连续打印见样例五 6.如何输出多页长文档及双面打印见样例六 7.如何定向输出见样例七 8.如何打印图片见样例八 9.如何用程序加载打印维护背景图见样例九 10如何控制打印样式(STYLE)见样例十 11如何直接打印条形码见样例十一 12如何读写本地文件见样例十二 13如何打印旋转内容见样例十三 14如何按URL打印见样例十四 15如何打印表格的页头页尾见样例十五 16如何设置预览窗口大小见样例十六 17如何发打印机指令或直接读写端口见样例十七 18如何打印幅面高度不固定的票据见样例十八 19如何内嵌显示及预览时包含背景图见样例十九 20如何强制分页并预览多页卡片见样例二十 21如何控制打印维护的功能权限见样例二十一 22如何构建自己的纯WEB打印预览见样例二十二 23如何居中打印超文本见样例二十三 24如何选择界面皮肤见样例二十四 25如何指定输出到哪页或仅预览见样例二十五 26如何提高多页打印的性能见样例二十六 27如何导出数据到Excel文件见样例二十七 28如何快速读取客户端系统信息见样例二十八 29如何使用其它长度单位见样例二十九 30如何分页输出页面内容见样例三十 31如何打印表格的分页小计或合计见样例三十一 32如何实现清晰的图表打印见样例三十二 33如何实现甘特图等的图表打印见样例三十三 34如何使用百分比%和满页打印见样例三十四 35如何获得打印结果和程序代码见样例三十五 36如何在设计过程中用js编辑内容见样例三十六 37如何打印公章效果图见样例三十七 38如何用BASE64编码输出图片见样例三十八 39如何打印田字格、上划线等文本见样例三十九 40如何进行数据格式转换见样例四十 41如何把内容关联后按顺序打印见样例四十一 42如何把整页内容缩放打印见样例四十二 43如何分页打印综合表格见样例四十三 44如何缩放打印单个超文本内容见样例四十四 45如何获得打印状态及最终结果见样例四十五 46如何设置右边距和下边距见样例四十六
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值