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

news2025/1/9 17:18:07

一、引入依赖

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

<dependency>
	<groupId>com.google.zxing</groupId>
	<artifactId>core</artifactId>
	<version>3.4.1</version>
</dependency>

二、按照字符串生成二维码

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;

public class QRCodeGeneratorByString {

    public static void main(String[] args) {
        String filePath = "D:\\QRcode/qrcode";
        int width = 300;
        int height = 300;

        try {
            Map<EncodeHintType, Object> hintMap = new HashMap<>();
            hintMap.put(EncodeHintType.CHARACTER_SET, "UTF-8");
            hintMap.put(EncodeHintType.MARGIN, 1);
            hintMap.put(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.L);

            // 设置背景色和前景色
            Color backgroundColor = Color.WHITE;
            Color foregroundColor = Color.BLACK;

            for (int i = 10; i <= 19; i++) {
                // 生成类似 Fboard001 的字符串
                String content = "Fboard" + String.format("%03d", i);
                String fileFullPath = filePath + i + ".png";

                BitMatrix matrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hintMap);

                BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

                for (int x = 0; x < width; x++) {
                    for (int y = 0; y < height; y++) {
                        int color = matrix.get(x, y) ? foregroundColor.getRGB() : backgroundColor.getRGB();
                        image.setRGB(x, y, color);
                    }
                }

                File qrCodeFile = new File(fileFullPath);
                ImageIO.write(image, "png", qrCodeFile);

                System.out.println("QR Code for " + content + " generated successfully!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

三、按照Json文件生成二维码

方法一(将json字符串直接传入)

public class QRCodeGeneratorByOne {

    public static void main(String[] args) {
        String json = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}";
        String filePath = "D:\\QRcode/qrcode.png";
        int width = 300;
        int height = 300;

        try {

            Map<EncodeHintType, Object> hintMap = new HashMap<>();
            hintMap.put(EncodeHintType.CHARACTER_SET, "UTF-8");
            hintMap.put(EncodeHintType.MARGIN, 1);
            hintMap.put(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.L);

            // 设置背景色和前景色
            Color backgroundColor = Color.WHITE;
            Color foregroundColor = Color.BLACK;

            BitMatrix matrix = new MultiFormatWriter().encode(json, BarcodeFormat.QR_CODE, width, height, hintMap);

            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    int color = matrix.get(x, y) ? foregroundColor.getRGB() : backgroundColor.getRGB();
                    image.setRGB(x, y, color);
                }
            }

            File qrCodeFile = new File(filePath);
            ImageIO.write(image, "png", qrCodeFile);

            System.out.println("QR Code generated successfully!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

方法二(将json文件导入方法)

如果,希望二维码中包含更多的信息,使用字符串已经无法满足的情况下,可以尝试使用json文件先根据 json文件,创建对应的对象:

@Data
@Getter
@Setter
public class JsonData {
    private String name;
    private int age;
    private String city;
}

import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class QRCodeGenerator {
    public static void main(String[] args) {

        String jsonFilePath = "D:\\QRcode/file.json";
        generateQRCodeFromJsonFile(jsonFilePath);
    }
    public static void generateQRCodeFromJsonFile(String jsonFilePath) {
        try {
            // 读取JSON文件
            File file = new File(jsonFilePath);
            ObjectMapper objectMapper = new ObjectMapper();
            JsonData[] jsonDataArray = objectMapper.readValue(file, JsonData[].class);
            // 逐个解析JSON并生成二维码
            for (JsonData jsonData : jsonDataArray) {
                String jsonString = objectMapper.writeValueAsString(jsonData);
                // 生成二维码图片
                String qrCodeImagePath = generateQRCodeImage(jsonString);
                System.out.println("Generated QR Code for JSON: " + jsonString);
                System.out.println("QR Code image path: " + qrCodeImagePath);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static String generateQRCodeImage(String data) {
        int width = 300;
        int height = 300;
        String format = "png";
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
        //加上三位随机数
        Random random = new Random();
        int end3 = random.nextInt(999);
        try {
            BitMatrix bitMatrix = new MultiFormatWriter().encode(data, BarcodeFormat.QR_CODE, width, height, hints);
            File qrCodeFile = new File("D:\\QRcode/qrcode"+end3+".png");
            MatrixToImageWriter.writeToFile(bitMatrix, format, qrCodeFile);
            return qrCodeFile.getAbsolutePath();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

注意: 

此处要求的文件格式是json数组,而不是json对象

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1624440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java中使用Graphics2D绘制字符串文本自动换行 算法

效果&#xff1a; 代码&#xff1a; /*** return void* Author xia* Description //TODO 写字换行算法* Date 18:08 2021/4/1* Param []**/private static void drawWordAndLineFeed(Graphics2D g2d, Font font, String words, int wordsX, int wordsY, int wordsWidth) {FontD…

SPRD Android 14 通过属性控制系统设置显示双栏或者单栏

SPRD Android 14 通过属性控制系统设置显示双栏或者单栏 第一步 确认有添加静态库第二步 验证第三步 修改源码在合适的地方配置 ro.product.is_support_SettingsSplitEnabled 即可。第一步 确认有添加静态库 --- a/packages/apps/Settings/Android.bp +++ b/packages/apps/Set…

DC学习笔记

视频 数字逻辑综合工具实践 DC 01_哔哩哔哩_bilibili 一、DC工作模式&#xff08;此小节为搬运内容&#xff09; 原链接&#xff1a;Design_Compiler User Guide 随手笔记&#xff08;9&#xff09;Using Floorplan Information - 知乎 DC拥有四种工作模式&#xff1a; 工…

Vivado-OOC

OOC⇒Out-of-Context 在Vivado中&#xff0c;对于顶层设计&#xff0c;vivado使用自顶向下的全局&#xff08;global&#xff09;综合&#xff0c;将顶层文件下的所有模块都进行综合&#xff0c;但是在实际设计过程中&#xff0c;顶层设计会被多次修改和综合&#xff0c;但是有…

CodeGemma初探

什么是 CodeGemma CodeGemma是一系列强大而轻量级的模型的集合&#xff0c;可以执行各种编码任务&#xff0c;包括填充中间代码补全、代码生成、自然语言理解、数学推理和指令跟随。 版本&#xff1a; instruct&#xff1a;7B, 这个版本专门针对自然语言到代码聊天和指令跟随…

文件上传漏洞(upload-labs)

目录 一、文件上传漏洞 1.什么是文件上传漏洞 常见的WebShell 2.文件上传产生漏洞的原因 二、文件上传绕过 &#xff08;一&#xff09;客服端绕过-JS验证 1.前端验证 upload-labs第一关 &#xff08;二&#xff09;绕过黑名单验证 黑名单验证 1.特殊解析后缀 upl…

项目十:学会python爬虫数据保存(小白圆满级)

前言 上篇我们学会的文本文件、csv文件和excel文件的相关基础知识和操作&#xff0c;这一次我们再来了解一下四个文件操作方式 存储方法 HTML文件 将数据保存为HTML格式&#xff0c;可以直接在浏览器中查看。 使用字符串拼接将数据保存为HTML格式。 代码案例 # 创建数据…

【树莓派】如何用电脑连接树莓派的远程桌面,灰屏解决

要使用VNC桌面连接到树莓派&#xff0c;你需要确保已经安装并启动了VNC服务器。以下是连接到树莓派的步骤&#xff1a; 在树莓派上启动VNC服务器&#xff1a; 打开终端或SSH连接到你的树莓派。输入以下命令以安装RealVNC的VNC服务器&#xff1a;sudo apt update sudo apt insta…

操作steam搬砖有哪些风险?你有中招吗?揭秘有没有规避技巧?

一、关于steam账号的地区问题&#xff1a; steam账号地区不要频繁的去更换&#xff0c;这样很容易导致让账号红信不能操作使用。 二、关于steam账号的充值问题&#xff1a; 一定要充值正规的礼品卡图&#xff0c;否则遇到黑卡分分钟让你的账号红锁&#xff0c;从而造成账号里…

Gemini 1.5 Pro API崭露头角,长提示下性能卓越,逼近榜首ChatGPT4

Gemini 1.5 Pro API-0409-preview 在排行榜上成功攀升至第二位&#xff0c;与榜首的 GPT-4-Turbo 齐头并进&#xff0c;仅一步之遥。相较于第三名的 GPT4-0125-preview&#xff0c;Gemini 展现出了显著的优势。 在处理更长的提示时&#xff0c;Gemini 的性能尤为出色&#xff…

【源码】完美运营版商城+虚拟商品全功能商城+全能商城小程序+智慧商城系统+全品类百货商城

完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城 干干净净 没有一丝多余收据 还没过手其他站 还没乱七八走的广告和后门 后台可以自由拖曳修改前端UI页面 还支持虚拟商品自动发货等功能 挺不错的一套源码 前端UNIAPP 后端PHP 一键部署版本 CD&…

MySQL尾部空格处理与哪些设置有关? 字符集PAD SPACE与NO PAD属性的区别、MySQL字段尾部有空格为什么也能查询出来?

文章目录 一、问题背景二、字符集PAD_ATTRIBUTE属性&#xff08;补齐属性&#xff09;2.2、PAD SPACE与NO PAD的具体意义 三、CHAR类型尾部空格的处理四、其他问题4.1、在PAD SPACE属性时如何实现精准查询 五、总结 以下内容基于MySQL8.0进行讲解 一、问题背景 一次查询中发现…

MMSeg分析Flops和Params

Flops计算量&#xff0c;params参数量 在文件中 tools/analysis_tools/get_flops.py利用以下命令实现 python tools/analysis_tools/get_flops.py configs/xxx/xxx-Net.py后面可跟参数shape控制输入图片尺寸&#xff0c;例如 python tools/analysis_tools/get_flops.py conf…

每天不知道吃什么?食谱生成AI工具,帮你实现食谱自由

原文&#xff1a;每天不知道吃什么&#xff1f;食谱生成AI工具&#xff0c;帮你实现食谱自由 - 知乎 每天吃什么或许是世纪难题&#xff0c;要想吃的美味、吃的营养更是难上加难面对繁琐的食材怎么做才能省心省力更美味呢&#xff1f;不妨问问AI看能不能辅助我们做出别样美味。…

【Matlab函数分析】对二维或三维散点数据插值函数scatteredInterpolant

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

6.MMD ray渲染 材质的添加及打光方法

材质 前置准备 先准备好模型和场景 将ray控制器拖入进去 添加完默认的材质以后的效果 打开插入材质页面 打开MaterialMap栏 将流萤的模型展开 自发光 现在给领带添加一个自发光效果 在自发光Emissive里&#xff0c;打开x1&#xff0c;选择albedo&#xff0c;白光 现在…

为什么要分库分表?(设计高并发系统的时候,数据库层面该如何设计?)

目录 1.分表 2.分库 说白了&#xff0c;分库分表是两回事儿&#xff0c;大家可别搞混了&#xff0c;可能是光分库不分表&#xff0c;也可能是光分表不分库&#xff0c;都有可能。 我先给大家抛出来一个场景。 假如我们现在是一个小创业公司(或者是一个 BAT …

用Python和Pygame实现简单贪吃蛇游戏

1.pip安装pygame pygam插件安装 pip install 插件名字 # 安装 pip uninstall 插件名字 # 卸载 pip install 插件名字 -i 指定下载的镜像网址 pip show 插件名字 # 查看插件名字 pip install pygame -i https://pypi.tuna.tsinghua.edu.cn/simple pip show p…

猫头虎分享已解决Error || 已解决error: subprocess-exited-with-error

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

零基础HTML教程(26)--表单元素标注

文章目录 1. 引子2. 使用标注3. 元素的id与name4. 更好的写法5. 小结 1. 引子 我们看一个表单&#xff1a; <form>姓名&#xff1a;<input type"text"><br>手机号:<input type"text"><br>年龄:<input type"text&qu…