SpringBoot使用Zxing生成二维码

SpringBoot使用Zxing生成二维码

    • 什么是Zxing
    • 具体实现
      • [1. 在pom文件中导入依赖](#1. 在pom文件中导入依赖)
      • [2. 二维码生成工具类](#2. 二维码生成工具类)
      • [3. 控制层和服务层](#3. 控制层和服务层)
      • [4. 前端](#4. 前端)
    • 总结
    • 参考

什么是Zxing

ZXing,一个支持在图像中解码和生成条形码(如二维码、PDF 417、EAN、UPC、Aztec、Data Matrix、Codabar)的库。ZXing("zebra crossing")是一个开源的、多格式的、用Java实现的一维/二维条码图像处理库,具有到其他语言的端口。

具体实现

对于在Spring项目中使用Zxing生成二维码,其实比较简单,只需要引入依赖,然后调用方法,并传入需要的参数即可。

最核心的代码就是
QRCodeWriter qrCodeWriter=new QRCodeWriter(); bitMatrix=qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hints);

text :二维码中携带的内容

BarcodeFormat.QR_CODE :是一个枚举值,表示二维码(Quick Response Code)格式

width: 宽

height: 高

hints: 是一个map,包含一些其他的设置内容

1. 在pom文件中导入依赖

xml 复制代码
		<!-- ZXing二维码 -->
		<dependency>
			<groupId>com.google.zxing</groupId>
			<artifactId>core</artifactId>
			<version>3.4.1</version> 
		</dependency>
		<dependency>
			<groupId>com.google.zxing</groupId>
			<artifactId>javase</artifactId>
			<version>3.4.1</version>
		</dependency>

2. 二维码生成工具类

生成的二维码可以输出到本地文件中,也可以直接以IO流的形式返回给前端,前端再进行二维码的显示。

java 复制代码
package com.lixy.sharingcurriculum.util;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.HashMap;

public class QRCodeGenerator {

    /**
     * 生成二维码输出文件
     * @param text
     * @throws WriterException
     * @throws IOException
     */
    public static void generateQRCodeImage(String text) throws WriterException, IOException {

        int width = 350;
        int height = 350;
        String filePath = "C:/Users/li/Pictures/qrtest.png";

        // 定义二维码的参数
        HashMap<EncodeHintType, ErrorCorrectionLevel> hintMap = new HashMap<>();
        hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); QRCodeWriter qrCodeWriter = new QRCodeWriter();
        BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);
        Path path = FileSystems.getDefault().getPath(filePath);
        MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
    }

    /**
     * 生成二维码并以IO流返回
     * @param text
     * @return
     * @throws WriterException
     */
    public static BitMatrix createQRCode(String text) throws IOException {

        int width=200;
        int height=200;

        HashMap<EncodeHintType,Object> hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET,"UTF-8"); //指定字符编码为"utf-8"
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); //指定二维码的纠错等级为中级
        hints.put(EncodeHintType.MARGIN, 2); //设置图片的边距,单位像素,非负值

        BitMatrix bitMatrix=null;

        try{
            QRCodeWriter qrCodeWriter=new QRCodeWriter();
            bitMatrix=qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hints);
        }catch (WriterException e){
            e.printStackTrace();
        }

        return bitMatrix;
    }

    public static void main(String[] args) {
        try {
            generateQRCodeImage("code");
        } catch (WriterException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. 控制层和服务层

java 复制代码
/**
     * 生成带有课程表信息的二维码
     */
    @PostMapping("/generateQRCode")
    public void generateQRCode(String scheduleid,HttpServletResponse response) throws IOException {
        //设置响应流信息
        response.setContentType("image/png");
        //没有缓存
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        //设置过期的时间戳,为0表示立即过期
        response.setDateHeader("Expire", 0);

        BitMatrix bitMatrix=scheduleService.generateQRCode(scheduleid);

        OutputStream stream=response.getOutputStream();
        MatrixToImageWriter.writeToStream(bitMatrix,"png",stream);

    }
java 复制代码
/**
     * 生成带有课程表信息的二维码
     * @return
     */
    @Override
    public BitMatrix generateQRCode(String scheduleid) throws IOException {

        Schedule schedule=scheduleMapper.selectById(scheduleid);

        //将课表信息转换为json格式
        String scheduleJson= JSON.toJSONString(schedule);
        return QRCodeGenerator.createQRCode(scheduleJson);

    }

4. 前端

javascript 复制代码
wx.request({
      url: 'http://localhost:8080/schedule/generateQRCode?scheduleid='+this.data.id,
      method:'POST',
      responseType: 'arraybuffer', // 指定返回类型为ArrayBuffer
      success:res=>{
        const base64=wx.arrayBufferToBase64(res.data);
        const imagesrc='data:image/png;base64,'+base64;
        console.log("二维码url:"+imagesrc)
        this.setData({
          qrCodeImg:imagesrc
        })
      }
    })
html 复制代码
		<view>
			扫描二维码即可导入课表
		</view>
		<image src="{{qrCodeImg}}" mode="aspectFit"/>  

总结

另外还可以使用一些其他的方式生成二维码,比如基于开源的Hutool工具生成二维码,可以参考SpringBoot系列(22):Java生成二维码的几种实现方式(基于Spring Boot)

也可以直接使用js生成,有QRCode.js库可以直接引用。

参考

使用Zxing生成二维码
Java生成二维码并以IO流的形式返回给前端展示(不需写入服务器),以及下载二维码图片

相关推荐
向前看-1 小时前
验证码机制
前端·后端
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭2 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
超爱吃士力架3 小时前
邀请逻辑
java·linux·后端
李小白663 小时前
Spring MVC(上)
java·spring·mvc
AskHarries5 小时前
Spring Cloud OpenFeign快速入门demo
spring boot·后端
isolusion6 小时前
Springboot的创建方式
java·spring boot·后端
Yvemil76 小时前
《开启微服务之旅:Spring Boot Web开发举例》(一)
前端·spring boot·微服务
zjw_rp6 小时前
Spring-AOP
java·后端·spring·spring-aop
TodoCoder7 小时前
【编程思想】CopyOnWrite是如何解决高并发场景中的读写瓶颈?
java·后端·面试
凌虚7 小时前
Kubernetes APF(API 优先级和公平调度)简介
后端·程序员·kubernetes