SpringBoot+zxing批量生成二维码_南国

SpringBoot生成和解析二维码完整工具类分享(提供Gitee源码) 在日常的开发工作当中可能需要实现一个二维码小功能,我参考了网上很多关于SpringBoot生成二维码的教程,最终还是自己封装了一套完整生成二维码的工具类,可以支持基础的黑白二维码、带颜色的二维码、带Logo的二维码、带颜色和Logo的二维码和解析二维码,一共4种非常的全面了,可以生成具体的二维码文件或返回Base64,都是博主自己手写封装好的,这边免费开源给大家一键使用!只求大家一个免费的三连支持! 阅读详情

这个没啥好说的俩类就完事,随便写写,做个记录吧

直接上代码,三步完成

第一步:引Maven的jar包

	<dependency>
			<groupId>com.google.zxing</groupId>
			<artifactId>javase</artifactId>
			<version>3.3.1</version>
	</dependency>

第二步:添加工具类

package com.hnyfkj.agriculturalpark.biz.code;

import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;
import java.util.Hashtable;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

public class QRCodeUtil {
	private static final String CHARSET = "utf-8";
	private static final String FORMAT_NAME = "JPG";
	// 二维码尺寸
	private static final int QRCODE_SIZE = 1000;
	// LOGO宽度
	private static final int WIDTH = 60;
	// LOGO高度
	private static final int HEIGHT = 60;

	private static BufferedImage createImage(String content, String imgPath, boolean needCompress) throws Exception {
		@SuppressWarnings("rawtypes")
		Hashtable<EncodeHintType, Comparable> hints = new Hashtable<EncodeHintType, Comparable>();
		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
		hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
		hints.put(EncodeHintType.MARGIN, 1);
		BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,
				hints);
		int width = bitMatrix.getWidth();
		int height = bitMatrix.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, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
			}
		}
		if (imgPath == null || "".equals(imgPath)) {
			return image;
		}
		// 插入图片
		QRCodeUtil.insertImage(image, imgPath, needCompress);
		return image;
	}

	private static void insertImage(BufferedImage source, String imgPath, boolean needCompress) throws Exception {
		File file = new File(imgPath);
		if (!file.exists()) {
			System.err.println("" + imgPath + "   该文件不存在!");
			return;
		}
		Image src = ImageIO.read(new File(imgPath));
		int width = src.getWidth(null);
		int height = src.getHeight(null);
		if (needCompress) { // 压缩LOGO
			if (width > WIDTH) {
				width = WIDTH;
			}
			if (height > HEIGHT) {
				height = HEIGHT;
			}
			Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);
			BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
			Graphics g = tag.getGraphics();
			g.drawImage(image, 0, 0, null); // 绘制缩小后的图
			g.dispose();
			src = image;
		}
		// 插入LOGO
		Graphics2D graph = source.createGraphics();
		int x = (QRCODE_SIZE - width) / 2;
		int y = (QRCODE_SIZE - height) / 2;
		graph.drawImage(src, x, y, width, height, null);
		Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
		graph.setStroke(new BasicStroke(3f));
		graph.draw(shape);
		graph.dispose();
	}

	public static void encode(String content, String imgPath, String destPath, boolean needCompress) throws Exception {
		BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);
		mkdirs(destPath);
		// String file = new Random().nextInt(99999999)+".jpg";
		// ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file));
		ImageIO.write(image, FORMAT_NAME, new File(destPath));
	}

	public static BufferedImage encode(String content, String imgPath, boolean needCompress) throws Exception {
		BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);
		return image;
	}

	public static void mkdirs(String destPath) {
		File file = new File(destPath);
		// 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
		if (!file.exists() && !file.isDirectory()) {
			file.mkdirs();
		}
	}

	public static void encode(String content, String imgPath, String destPath) throws Exception {
		QRCodeUtil.encode(content, imgPath, destPath, false);
	}
	// 被注释的方法
	/*
	 * public static void encode(String content, String destPath, boolean
	 * needCompress) throws Exception { QRCodeUtil.encode(content, null,
	 * destPath, needCompress); }
	 */

	public static void encode(String content, String destPath) throws Exception {
		QRCodeUtil.encode(content, null, destPath, false);
	}

	public static void encode(String content, String imgPath, OutputStream output, boolean needCompress)
			throws Exception {
		BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);
		ImageIO.write(image, FORMAT_NAME, output);
	}

	public static void encode(String content, OutputStream output) throws Exception {
		QRCodeUtil.encode(content, null, output, false);
	}

	public static String decode(File file) throws Exception {
		BufferedImage image;
		image = ImageIO.read(file);
		if (image == null) {
			return null;
		}
		BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
		BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
		Result result;
		Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>();
		hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
		result = new MultiFormatReader().decode(bitmap, hints);
		String resultStr = result.getText();
		return resultStr;
	}

	public static String decode(String path) throws Exception {
		return QRCodeUtil.decode(new File(path));
	}
}

第三步:引用工具类中的生成方法

package com.hnyfkj.agriculturalpark.biz.code.controller;

import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.hnyfkj.agriculturalpark.biz.assetsinfo.service.AssetsInfoService;
import com.hnyfkj.agriculturalpark.biz.code.QRCodeUtil;
import com.hnyfkj.agriculturalpark.biz.tracesourcelist.entity.TracesourceListEntity;
import com.hnyfkj.agriculturalpark.biz.tracesourcelist.service.TracesourceListService;

import io.swagger.annotations.Api;

@RestController
@RequestMapping("/down")
@Api(tags = { "资产信息列表导出" })
public class ErWeiMazipController {

	@Autowired
	private TracesourceListService tracesourceListService;

	/**
	 * data为链接,用 , 分割
	 * 
	 * @param response
	 * @param data
	 * @throws Exception
	 */
	@RequestMapping("/downloadAllQr")
	public void download(HttpServletResponse response, String traceSourceBatch) throws Exception {
		ZipOutputStream zos = null;
		String downloadFilename = "追溯码";
		// 转换中文否则可能会产生乱码
		downloadFilename = URLEncoder.encode(downloadFilename, "UTF-8");
		// 指明response的返回对象是文件流
		response.setContentType("application/octet-stream");
		// 设置在下载框默认显示的文件名
		response.setHeader("Content-Disposition", "attachment;filename=" + downloadFilename + ".zip");
		String url = "http://xxxx";
		// 根据溯源码批次查找
		List<TracesourceListEntity> tracesourceListEntity = tracesourceListService.findListByTrace(traceSourceBatch);
		// 组装Url
		zos = new ZipOutputStream(response.getOutputStream());
		// 循环遍历组装
		for (TracesourceListEntity tracesourceList : tracesourceListEntity) {
			String uu = url + "?product_batch=" + tracesourceList.getProductBatch() + "&trace_source_id="
					+ tracesourceList.getTraceSourceId();
			zos.putNextEntry(new ZipEntry(tracesourceList.getTraceSourceId() + ".png"));
			ImageIO.write(QRCodeUtil.encode(uu, "D:/logo.png", true), "jpg", zos);
		}
		zos.flush();
		zos.close();
	}

}

完事了,自己测吧,具体扫码出现的数据根据自己业务来

简单的拼接成url能扫出来就完事了

前人种树后人乘凉,你们慢慢乘凉哈

springboot-批量生成二维码 功能介绍: 可以通过页面上传Excel表格,批量生成二维码,并下载生成二维码图片。 立即下载

相关推荐

SpringBoot生成二维码单个下载和打包下载。

实际开发中有不少二维码生成并下载的需求,单个和批量下载都比较常见,最近又来了这种需求,决定记录一下。 https://blog.youkuaiyun.com/weixin_40579395/article/details/124040713?spm=1001.2014.3001.5502 源码

springboot+hutool批量生成二维码压缩导出

文章目录1.引入依赖2.测试编码3.批量生成4.解析excel5.批量图片压缩6.上传excel直接将输出流转成压缩包 1.引入依赖 <!-- 生成二维码依赖--> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <ver

作为一个长者,有必要记录下人生经验 1511

生成二维码两种方法

java生产二维码的两种方法,有源码,java代码和js代码。

用itextpdf google.zxing批量生成资产标签pdf 带二维码

这里写自定义目录标题 #资产标签pdf批量生成(含文字和二维码,多页) 第一步:创建基础word文档,并另存为pdf文档格式 第二步:用Adobe Acrobat 9 Pro 打开保存好的pdf文档,启用表单编辑添加域。 第三步:上代码 //jar包依赖 <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --> <dependency> <groupId>com.itextpdf&lt

weixin_43913457的博客 934

利用Qrcode批量生成二维码

利用QrCodeNet批量生成二维码,并附有导出,排版打印功能。

springboot多文件上传下载,文件打包下载,ztree树形下拉框.zip

本demo主要是实现多文件上传下载功能,多文件打包下载,ztree树形下拉框,前端采用layui,内含mysql文件

SpringBoot (批量)生成二维码工具类多种方法示例

Java (批量)生成二维码工具类示例

白白白鲤鱼的博客 2128

SpringBoot二维码和条形码生成工具包

java生成二维码和条形码(一维码),每个工具类自带main方法,改一下包名和生成路径即可测试。本人使用SpringBoot开发,打包上传的资源

SpringBoot项目生成二维码,再生成Excel文件导出,亲测采坑

SpringBoot项目生成二维码,再生成Excel文件导出,亲测采坑

qq_17731471的博客 878

java中使用zxing批量生成二维码立牌

本篇文章主要介绍了java中使用zxing批量生成二维码立牌,非常具有实用价值,需要的朋友可以参考下。

近几年预训练语音大模型汇总

语音大模型研究近年来取得显著进展,主要包括wav2vec 2.0(2020)、HuBERT(2021)、WavLM(2022)、Data2Vec(2022)、Whisper(2023)等代表性工作。这些模型采用自监督学习框架,通过掩码预测、对比学习等策略在大规模语音数据上预训练,可有效应用于语音识别、情感分析、疾病检测等下游任务。其中wav2vec 2.0首次将对比学习引入语音领域,Whisper通过68万小时弱监督数据实现强大的跨语言能力。这些突破为低资源语音任务提供了通用特征提取方案,推动了医疗语音分析

victory0431的博客 1776

SpringBoot利用ZXing工具来生成二维码(简单)

一、简单二维码生成 1.1、依赖 <!--二维码工具--> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.4.1</version> </dependency> 1.2、二维码生成工具 QRCodeUtil package com.example.demo.ut

qq_45660133的博客 2868

AI数字人短视频数字人口播数字人分身建模流程全解析

在人工智能与计算机图形学蓬勃发展的当下,数字人建模作为打造虚拟数字人的核心环节,其流程复杂且精妙,融合了多种前沿技术与创意构思,为栩栩如生的数字人形象奠定基石。​。

2403_87518095的博客 1444

SpringBoot通过QRCode生成二维码

SpringBoot通过QRCode生成二维码

qinxun2008081的博客 1126

Android图形系统(三)系统篇:渲染/合成的底层原理浅析

众所周知,渲染工作是由GPU负责,那么在聊GPU之前首先得知道什么是“渲染”?我们来举个例子感受一下在系统中申请一块10*101、把图层背景这玩意染成绿的2、从左上(0,0)到右下(10,10)画一条宽度为1颜色为红色的直线3、以坐标点(5,5)为中心,画一个半径为3的实心圆,颜色要蓝色好了,接下来操作系统会把这些“绘图指令”同步给GPU去执行渲染任务图片来源:自己画的GPU完成渲染工作后,我们将会得到一个大小为10*10二维数组,数组中的每个元素都保存着坐标点的颜色信息、深度信息。

1354

LMS Virtual.Lab二次开发:声学仿真结果导出方法(VBScript、Python)

Siemens LMS Virtual.Lab 提供一套集成软件平台用以模拟机械系统的品质属性,如结构完整性、振动噪声、耐久性、系统动力学特性、驾驶的平顺性及操纵的稳定性等。

爱看书的小沐 6015

Java 批量生成二维码图片,并打包成可直接下载的zip包(spring boot)

最近做的一个项目中,需要提供给web端一个接口:downloadQr。用到了Google的Zxing框架,版本是3.3.1 。项目使用的是springboot框架。一、API文档接口名称:/downloadAllQr 接口描述:批量生成二维码图片,并打包成可直接下载的zip包 请求方式:GET 请求参数:String data 响应内容:zip文件流二、下面直接上代码 controll

猫玛尼的技术之路 8263

YOLOv改进 | YOLOv11添加WTConv小波卷积,能够更有效地捕捉局部和全局特征

在计算机视觉目标检测领域,YOLO(You Only Look Once)系列算法凭借“单阶段检测”的高效性(一次前向传播同时完成目标定位与分类),已成为工业界与学术界的主流选择。从YOLOv1到YOLOv11,算法持续迭代优化,在速度与精度之间寻求平衡,广泛应用于自动驾驶、智能安防、工业质检等场景。为解决上述问题,本文提出一种基于,将输入特征图分解为不同频率的子带(低频全局信息与高频局部细节),并分别通过卷积操作提取局部与全局特征,最后融合多尺度特征,从而更有效地捕捉目标的局部细节与全局结构。

走向CTO的路上... 1247

SpringBoot生成二维码/下载压缩包文件/将图片转成base64输出

一个在学习的开发者,勿喷,欢迎交流。

m0_55841258的博客 885

YOLOv8改进 | 主干网络 | 将主干网络替换为轻量化的ShuffleNetv2【原理 + 完整代码】

yolov8,yolov8创新,yolov8改进

kay_545 2563

ICC2:使用analyze_lib_cell_placement检查lib cell的pass rate

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?在place之前需要使analyze_lib_cell_placement命令去检查lib cell在当前的site row/power plan/legalize设置的环境下能够正常place和legalize。下面分享一个脚本去报告pass rate低于2%的lib cell。

m0_61544122的博客 673

使用zxing批量生成二维码立牌

使用zxing批量在做好的立牌背景图的指定位置上,把指定的文本内容(链接地址、文本等)生成二维码并放在该位置, 最后加上立牌编号。

Mr_Smile2014的博客 5509

linux内核学习(八)---摄像头框架移植(上)

本章来开始进行摄像头的移植,同时回顾一下V4L2的整个框架

文艺小少年的博客 112

SpringBoot生成二维码

目录 Zxing原生方式 添加依赖 二维码生成工具类 添加Controller 添加测试页面 使用postman测试效果 Hutool的方式 添加依赖 创建QRCodeService 添加Controller 效果测试 我们使用两种方式,去生成二维码,但是其实,二维码的生成基础,都是zxing包,这是Google开源的一个包,第一种是使用原始的zxing方式去实现,第二种是使用hutool来实现,hutool其实也是对于zxing的一个封装,但是封装前后,确实...

koko创作 4196

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VUE+Springboot实现生成二维码及二维码下载功能

arr:二维码图片上要显示的内容。//todo 放置尾部logo。content:二维码内容。

askuld的博客 1632

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

SpringBoot实现二维码生成

SpringBoot实现二维码生成

lixianhe的博客 8737

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: SpringBoot+EasyPoi三步完成Excel导入导出_南国
下一篇: Oracle删除一周,一个月,一年之前的数据Sql
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值