SpringBoot生成条形码的方案详解

 更新时间:2024年08月13日 08:53:43   作者:码到三十五  
在Spring Boot, Spring Cloud 项目中整合ZXing库来生成条形码在特定行业也是一个常见需求,ZXing是google开源的一个功能强大的Java库,专门用于二维码/条形码等的生成与解析,所以本文给大家介绍了SpringBoot生成条形码的方案,需要的朋友可以参考下

引言

在Spring Boot, Spring Cloud 项目中整合ZXing库来生成条形码在特定行业也是一个常见需求。

ZXing是google开源的一个功能强大的Java库,专门用于二维码/条形码等的生成与解析。它不仅能够生成QR码/条形码,还能解析包括QR码/条形码在内的多种格式.

1. 添加zxing的依赖

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

2. 生成条形码

import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.oned.Code128Writer;
import org.springframework.stereotype.Service;

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

@Service
public class BarcodeService {

    /**
     * 生成条形码并保存到指定路径
     * @param content 条形码内容
     * @param path 保存路径
     * @param width 条形码宽度
     * @param height 条形码高度
     */
    public void generateBarcodeImage(String content, String path, int width, int height) {
        Code128Writer barcodeWriter = new Code128Writer();
        BitMatrix bitMatrix = null;
        try {
            bitMatrix = barcodeWriter.encode(content, BarcodeFormat.CODE_128, width, height);
            Path filePath = FileSystems.getDefault().getPath(path);
            MatrixToImageWriter.writeToPath(bitMatrix, "PNG", filePath);
        } catch (WriterException | IOException e) {
            e.printStackTrace();
        }
    }
}

3. 调用条形码服务

最后,在Spring Boot的中调用这个服务生成条形码:

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

@RestController
public class BarcodeController {

    @Autowired
    private BarcodeService barcodeService;

    @GetMapping("/generate-barcode")
    public String generateBarcode(@RequestParam String content, @RequestParam String path, @RequestParam int width, @RequestParam int height) {
        barcodeService.generateBarcodeImage(content, path, width, height);
        return "Barcode generated successfully at " + path;
    }
}

现在,当你访问/generate-barcode端点并传递相应的参数时,它将生成一个条形码并将其保存到指定的路径。例如:

http://localhost:8080/generate-barcode?content=123456789&path=/path/to/barcode.png&width=300&height=100

这将生成一个内容为123456789、宽度为300像素、高度为100像素的条形码,并将其保存到/path/to/barcode.png路径下。

4. 返回条形码

如果需要将条形码直接返回,简单修改一下就好。

先修改BarcodeService以返回一个byte[]数组:

import com.google.zxing.*;
import com.google.zxing.client.j2se.MatrixToImageConfig;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.oned.Code128Writer;
import org.springframework.stereotype.Service;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

@Service
public class BarcodeService {

    /**
     * 生成条形码的字节数据
     * @param content 条形码内容
     * @param width 条形码宽度
     * @param height 条形码高度
     * @return 条形码的字节数据
     */
    public byte[] generateBarcodeImage(String content, int width, int height) {
        Code128Writer barcodeWriter = new Code128Writer();
        BitMatrix bitMatrix = null;
        try {
            bitMatrix = barcodeWriter.encode(content, BarcodeFormat.CODE_128, width, height);
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            MatrixToImageConfig config = new MatrixToImageConfig(MatrixToImageConfig.BLACK, MatrixToImageConfig.WHITE);
            MatrixToImageWriter.writeToStream(bitMatrix, "PNG", outputStream, config);
            return outputStream.toByteArray();
        } catch (WriterException | IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}

然后,修改BarcodeController以返回图片的字节数据:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class BarcodeController {

    @Autowired
    private BarcodeService barcodeService;

    @GetMapping("/generate-barcode")
    public ResponseEntity<byte[]> generateBarcode(@RequestParam String content, @RequestParam int width, @RequestParam int height) {
        byte[] barcodeImage = barcodeService.generateBarcodeImage(content, width, height);
        if (barcodeImage != null) {
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.IMAGE_PNG);
            return new ResponseEntity<>(barcodeImage, headers, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
}

现在,当你在Spring Boot, Spring Cloud 项目中访问/generate-barcode端点并传递相应的参数时,它将生成一个条形码并将其作为PNG图片的字节数据返回。

到此这篇关于SpringBoot生成条形码的方案详解的文章就介绍到这了,更多相关SpringBoot生成条形码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Prometheus+Grafana的方法监控Springboot应用教程详解

    使用Prometheus+Grafana的方法监控Springboot应用教程详解

    这篇文章主要介绍了用Prometheus+Grafana的方法监控Springboot应用,本文通过实例代码详解给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • 关于SpringBoot的@ConfigurationProperties注解和松散绑定、数据校验

    关于SpringBoot的@ConfigurationProperties注解和松散绑定、数据校验

    这篇文章主要介绍了关于SpringBoot的@ConfigurationProperties注解和松散绑定、数据校验,@ConfigurationProperties主要作用就是将prefix属性指定的前缀配置项的值绑定到这个JavaBean上 ,通过指定的前缀,来绑定配置文件中的配置,需要的朋友可以参考下
    2023-05-05
  • spring Mvc配置xml使ResponseBody返回Json的方法示例

    spring Mvc配置xml使ResponseBody返回Json的方法示例

    这篇文章主要给大家介绍了关于spring Mvc配置xml使ResponseBody返回Json的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • 浅谈Strut2如何对请求参数的封装

    浅谈Strut2如何对请求参数的封装

    这篇文章主要介绍了浅谈Strut2如何对请求参数的封装,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12
  • 使用Spring组合自定义的注释 mscharhag操作

    使用Spring组合自定义的注释 mscharhag操作

    这篇文章主要介绍了使用Spring组合自定义的注释 mscharhag,本文通过实例代码给大家介绍的非常详细,对大家的工作或学习有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • springboot使用注解获取yml配置的两种方法

    springboot使用注解获取yml配置的两种方法

    本文主要介绍了springboot使用注解获取yml配置的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • IDEA导入外部项目报Error:java: 无效的目标发行版: 11的解决方法

    IDEA导入外部项目报Error:java: 无效的目标发行版: 11的解决方法

    这篇文章主要介绍了IDEA导入外部项目报Error:java: 无效的目标发行版: 11,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Java中关于char类型变量能够输出中文的问题

    Java中关于char类型变量能够输出中文的问题

    这篇文章主要介绍了Java中关于char类型变量能够输出中文的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Java视频断点上传的实现示例

    Java视频断点上传的实现示例

    断点续传指的是在下载或上传时,将下载或上传任务人为的划分为几个部分,本文主要介绍了Java视频断点上传的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • 解决mybatisplus MetaObjectHandler 失效的问题

    解决mybatisplus MetaObjectHandler 失效的问题

    本文主要介绍了解决mybatisplus MetaObjectHandler 失效的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02

最新评论