目录

背景

Maven依赖相关

二维码生成

基础实体类

二维码工具类

控制层代码

结果展示

单个二维码

二维码压缩包

源码地址


背景:

实际开发中有不少二维码生成并下载的需求,单个和批量下载都比较常见,最近又来了这种需求,决定记录一下,文末附上源码。

Maven依赖相关:

<!--二维码--><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.1.0</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.1.0</version></dependency>
<!--Lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.4</version></dependency>

二维码生成:

基础实体类:

package com.example.qrcode.util;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.HashMap;/*** @author yellow duck* @date 2022-04-08 14:41*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class QrCodeInfo {/*** 图片信息 示例:key - 二维码编号:  value - 0000001(具体的值)* */private HashMap<String, String> textMap;/*** 二维码信息* */private String info;
}

二维码工具类 :

package com.example.qrcode.util;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;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;import static com.google.zxing.client.j2se.MatrixToImageConfig.BLACK;
import static com.google.zxing.client.j2se.MatrixToImageConfig.WHITE;/*** 二维码相关工具类** @author yellow duck* @date 2022-04-08 14:34*/
public class QrCodeUtil {/*** 二维码宽和高*/private static final int WIDTH_AND_HEIGHT = 180;/*** 文字的X轴坐标*/private static final int TEXT_X = 200;/*** 文字的Y轴坐标*/private static int TEXT_Y = 80;/*** 文字的段落高度*/private static final int SPACE_Y = 40;/*** 二维码参数设置*/private static final Map<EncodeHintType, Object> HINTS;static {HINTS = new EnumMap<>(EncodeHintType.class);//设置编码HINTS.put(EncodeHintType.CHARACTER_SET, "UTF-8");//设置二维码的纠错级别HINTS.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);}/*** 绘制二维码并返回图片流** @param qrcode: 二维码相关信息* @date 2022/4/8 14:44* @author YD*/public static BufferedImage createQrCode(QrCodeInfo qrcode) throws WriterException {//设置对象并生成二维码BitMatrix bitMatrix = new MultiFormatWriter().encode(qrcode.getInfo(), BarcodeFormat.QR_CODE, WIDTH_AND_HEIGHT, WIDTH_AND_HEIGHT, HINTS);//创建二维码图片缓冲区BufferedImage image = new BufferedImage(WIDTH_AND_HEIGHT, WIDTH_AND_HEIGHT, BufferedImage.TYPE_INT_RGB);//生成二维码数组for (int x = 0; x < bitMatrix.getWidth(); x++) {for (int y = 0; y < bitMatrix.getHeight(); y++) {//二维坐标整个区域:画什么颜色image.setRGB(x, y, bitMatrix.get(x, y) ? BLACK : WHITE);}}//觉得这个字体好看一些 如果不喜欢可以换成微软雅黑 Font.BOLD为加粗 但会出现锯齿Font fontChinese = new Font("华文细黑", Font.PLAIN, 16);//创建画布的缓冲区BufferedImage bufferedImage = new BufferedImage(600, 240, BufferedImage.TYPE_4BYTE_ABGR);//创建画布Graphics2D g2d = bufferedImage.createGraphics();//设置背景颜色g2d.setBackground(Color.WHITE);//开启文字抗锯齿g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);//绘制二维码g2d.drawImage(image, 10, 30, image.getWidth(), image.getHeight(), null);//设置画笔颜色g2d.setColor(Color.BLACK);///设置二维码文本字体g2d.setFont(fontChinese);//绘制文字HashMap<String, String> textMap = qrcode.getTextMap();//填充文字textMap.forEach((key, value) -> {//每次间距为40 可以根据具体调整g2d.drawString(key + value, TEXT_X, TEXT_Y);TEXT_Y += SPACE_Y;});//恢复Y轴坐标TEXT_Y = 80;//销毁画笔g2d.dispose();bufferedImage.flush();image = bufferedImage;return image;}/*** 把生成的二维码打进压缩包并下载** @param images: 二维码流集合* @date 2022/4/8 15:26* @author YD*/public static void compressQrCodeToZip(List<BufferedImage> images, HttpServletResponse httpServletResponse) throws IOException {//重置HttpServletResponse防止乱码httpServletResponse.reset();ZipOutputStream zos = new ZipOutputStream(httpServletResponse.getOutputStream());//文件的名称String downloadFilename = "二维码压缩包.zip";//转换中文否则可能会产生乱码downloadFilename = URLEncoder.encode(downloadFilename, "UTF-8");// 指明response的返回对象是文件流httpServletResponse.setContentType("application/octet-stream; charset=UTF-8");//设置下载格式和名称httpServletResponse.setHeader("Content-Disposition", "attachment;filename=" + downloadFilename);//添加二维码进zip压缩包images.forEach(image -> {try {byte[] buf = new byte[8192];int len;//添加二维码进zipZipEntry entry = new ZipEntry(UUID.randomUUID() + ".png");zos.putNextEntry(entry);InputStream inputStream = bufferedImageToInputStream(image);//输出压缩包while ((len = inputStream.read(buf)) > 0) {zos.write(buf, 0, len);}inputStream.close();} catch (IOException e) {e.printStackTrace();}});zos.close();}/*** 下载单个二维码** @param bufferedImage:       二维码流* @param httpServletResponse: http响应* @date 2022/4/8 15:37* @author YD*/public static void singleQrCode(BufferedImage bufferedImage, HttpServletResponse httpServletResponse) throws IOException {//重置HttpServletResponse防止乱码httpServletResponse.reset();//文件的名称String downloadFilename = UUID.randomUUID() + ".png";//转换中文否则可能会产生乱码downloadFilename = URLEncoder.encode(downloadFilename, "UTF-8");// 指明response的返回对象是文件流httpServletResponse.setContentType("application/octet-stream; charset=UTF-8");//设置下载格式和名称httpServletResponse.setHeader("Content-Disposition", "attachment;filename=" + downloadFilename);//输出二维码到前端ImageIO.write(bufferedImage, "png", httpServletResponse.getOutputStream());}/*** 将BufferedImage转换为InputStream** @param image: 图片流* @date 2022/4/8 15:29* @author YD*/public static InputStream bufferedImageToInputStream(BufferedImage image) throws IOException {ByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(image, "png", os);try (InputStream input = new ByteArrayInputStream(os.toByteArray())) {return input;}}}

控制层代码:

package com.example.qrcode.controller;import com.example.qrcode.util.QrCodeInfo;
import com.google.zxing.WriterException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;import static com.example.qrcode.util.QrCodeUtil.*;/*** 二维码生成控制器** @author yellow duck* @date 2022-04-08 15:41*/
@RestController
@RequestMapping("qrcode")
public class QrCodeController {@GetMapping("downloadZip")public void downloadZip(HttpServletResponse httpServletResponse) throws IOException {List<BufferedImage> bufferedImages = new ArrayList<>();//这里把需要生成的二维码然后添加进bufferedImages集合里compressQrCodeToZip(bufferedImages,httpServletResponse);}@GetMapping("downloadOne")public void downloadOne(HttpServletResponse httpServletResponse) throws IOException, WriterException {HashMap<String, String> textMap = new HashMap<>();textMap.put("编号:","000001");textMap.put("名称:","二维码");BufferedImage bufferedImages = createQrCode(QrCodeInfo.builder().info("二维码的内容").textMap(textMap).build());singleQrCode(bufferedImages,httpServletResponse);}
}

结果展示:

单个二维码:

二维码压缩包:

源码地址:

SpringBoot生成二维码单个下载和打包下载。-Java文档类资源-CSDN下载https://download.csdn.net/download/weixin_40579395/85094823

Java生成二维码并把图片流导出压缩包下载(亲测可用)相关推荐

  1. java生成二维码(在图片上生成二维码(二维码带logo)并且在图片上添加文字标签)

    1pom.xml <!--生成二维码--> <dependency><groupId>cn.hutool</groupId><artifactId ...

  2. Java生成二维码并贴到新的图片上

    一.简述 1.Java生成二维码以来一些第三方库,本地的api会有一些bug,比如生成图片会造成红色蒙版,还有当二维码中字数过多,会造成二维码大小出现问题,要不就是二维码很大,要不就是二维码白边很大. ...

  3. java 生成二维码 QRCode、zxing 两种方式

    版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢. https://blog.csdn.net/testcs_dn/article/details/ ...

  4. Java生成二维码带LOGO底部标题竖版字体

    前言 Java后端生成二维码 底部 侧面带有标题,可调节字号 参考文章 使用Java生成二维码图片(亲测) Reborn_YY使用Java生成二维码图片 图标素材库 Java后台生成图片,前台实现图片 ...

  5. java生成二维码(链接生成二维码)

    Java二维码如何生成? awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com. ...

  6. java生成二维码到文件,java生成二维码转成BASE64

    java生成二维码到文件,java生成二维码转成BASE64 如题,利用java和第三方库,把指定的字符串生成二维码,并且把二维码保存成图片,转换成BASE64格式. 需要的jar文件: packag ...

  7. java生成二维码扫描跳转到指定的路径URL

    java生成二维码扫描跳转到指定的路径URL 导入依赖 <dependency><groupId>com.google.zxing</groupId><art ...

  8. Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码

    Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码 一.关于ZXing 1.ZXing是谷歌开源的支持二维码.条形码 等图形的生成类库:支持生成.和解码功能. G ...

  9. java 生成二维码后叠加LOGO并转换成base64

    1.代码 见文末推荐 2.测试 测试1:生成base64码 public static void main(String[] args) throws Exception {String data = ...

最新文章

  1. linux tomcat 突然验证码出不来
  2. 36.JVM内存分哪几个区,每个区的作用是什么、如和判断一个对象是否存活、java垃圾回收机制、垃圾收集的方法有哪些、java类加载过程、类加载机制、双亲委派、Minor GC和Major GC
  3. zookeeper 安装及集群
  4. c++STL中的find()函数 有两种使用方法
  5. java 动态获取IP地址(城市)
  6. [转载] 【python】Python中*args和**kwargs的区别(在Python中如何使用可变长参数列表)
  7. Django学习-19-缓存
  8. [环境搭建]-Web Api搭建到IIS服务器后PUT请求返回HTTP Error 405.0 - Method Not Allowed 解决方法
  9. BZOJ3680 吊打XXX
  10. Dreamweaver网页设计与制作100例:用DIV+CSS技术设计的书法主题网站(web前端网页制作课作业)
  11. android 截屏 水印,水印截图工具微商截图
  12. 搜狗微信的链接并转换成永久链
  13. 统计检验方法 大全,t -test 检验,Anova 检验,卡方检验,Kolmogorov–Smirnov 检验
  14. bin和obj文件夹
  15. 微服务架构开发实战:什么是微服务的熔断机制和熔断的意义
  16. Python py文件如何调用其他py文件
  17. 三菱PlC计数器与定时的使用
  18. linux运维基础-rpm包校验-rpm包安全修复-rpm覆盖
  19. icp许可证和edi许可证区别是什么?
  20. C语言原码,反码和补码转换详解

热门文章

  1. 高铁检测试验软件,京沪高铁试验检测项目
  2. 文华财经-DMI趋势模型-螺纹指数
  3. Vmware安装linux虚机,并打通宿主机与虚机间的网络访问
  4. 手把手教你使用ADSP-21569(七)在线调试程序的详细说明(TDM配置:4进12出)
  5. java 代码名称转换_计算机编码基础知识及Java中编码转换
  6. 安卓开发腾讯Bugly热修复集成和使用思路
  7. Vue 实现世界地图展示,根据国家中数量的多少区分(类似世界疫情地图)
  8. AP微积分内容是什么?
  9. 在hta中使用select下拉框
  10. 英语 后缀 (整理中)