SpringBoot生成条形码

SpringBoot生成条形码

条形码被广泛地应用于生活,它是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。各式各样的软件和工具都可以生成条形码,当然,被称为万金油的Java自然也不在话下。今天,就来介绍一下Java是如何生成条形码的。

  • 我们使用开源的barcode4j来作为解决方案,首先引入依赖

    <dependency>
       <groupId>net.sf.barcode4j</groupId>
       <artifactId>barcode4j-light</artifactId>
       <version>2.0</version>
    </dependency>
    
  • barcode4j作为开源解决方案,已有非常多的大佬写好工具类,为了敏捷开发,我们只需其调用静态方法即可(有更高追求的小伙伴可以尝试自己编写工具类)

    package com.****.energy.nat.utils;
    
    /**
     * @author ascool_zh
     * @create 2021-02-14:25
     */
    public class BarCodeUtil {
        private static final Logger LOGGER = LoggerFactory.getLogger(BarCodeUtil.class);
    
        /**
         * 生成文件
         *
         * @param msg
         * @param path
         * @return
         */
        public static File generateFile(String msg, String path) {
            File file = new File(path);
            if (!file.exists()) {
                try (FileOutputStream fileOutputStream = new FileOutputStream(file)) {
                    generate(msg, fileOutputStream);
                } catch (IOException e) {
                    LOGGER.error("generateFile error occurred", e);
                }
            }
            return file;
        }
    
         *//**
         * 生成字节
         *
         * @param msg
         * @return
         *//*
        public static byte[] generate(String msg) {
            ByteArrayOutputStream ous = new ByteArrayOutputStream();
            generate(msg, ous);
            return ous.toByteArray();
        }
    
        /**
         * 生成到流
         *
         * @param msg
         * @param ous
         */
        public static void generate(String msg, OutputStream ous) throws IOException {
            if (StringUtils.isEmpty(msg) || ous == null) {
                return;
            }
            //除了Code39,Code128亦可使用
            Code39Bean bean = new Code39Bean();
            // 精细度
            final int dpi = 150;
            // module宽度
            final double moduleWidth = UnitConv.in2mm(1.0f / dpi);
            // 配置对象
            bean.setModuleWidth(moduleWidth);
            bean.setWideFactor(3);
            bean.doQuietZone(false);
            String format = "image/png";
            // 输出到流
            BitmapCanvasProvider canvas = new BitmapCanvasProvider(ous, format, dpi,
                    BufferedImage.TYPE_BYTE_BINARY, false, 0);
            // 生成条形码
            bean.generateBarcode(canvas, msg);
            // 结束绘制
            canvas.finish();
        }
    }
    
    
  • 我们观察工具类,选取需要的方法,传入参数,即可生成二维码。这里我们选择生成文件的方式,我们考虑到生成的文件应放入一个特定的文件夹而不是打入jar包内,所以需要配置一下文件的访问路径和映射路径,具体可看步骤4。

  1. 先来一个简单的例子

    //一个简单的例子
    public class Test {
     public static void main(String[] args) {
            //需要写入条形码的信息
            String msg = "pillar666";
            //条形码生成文件路径
            String path = "D:\\pillar\\pilar666.jpg";
            //直接调用工具类静态方法
            BarCodeUtil.generateFile(msg,path);
        }
    }
    
  2. 结合SpringBoot的Web应用

    1. Controller层
    @Controller
    @RequestMapping("/nat/print")
    public class PrintBarcodeController extends BaseController{
    	@Autowired
        private PrintBarcodeService printBarcodeService;
    
        //获取配置文件里值
    	@Value("${barcode-filepath}")
    	private String barcodeFilepath;
    	
    @RequestMapping("/list")
    	@ResponseBody
    	public List<Map<String, Object>> getPrintList(String startCode, int count, String netCode) throws IOException {
    		List<Map<String, Object>> qryPrintList = printBarcodeService.getPrintList(startCode, count, netCode);
    		if (count <= 5000) {
    			for (Map<String, Object> map : qryPrintList) {
    				String msg = (String) map.get("barCode");
    				String path = barcodeFilepath + msg + ".png";
    				BarCodeUtil.generateFile(msg, path);
    			}
    		}
    		return qryPrintList;
    	}
    }
    

    2.配置文件appliction.yml

    #二维码生成文件路径,部署时请按需要配置
    barcode-filepath: D:/barcode/
    

    3.前台访问代码

    //js函数,返回访问文件的地址
    function _showPhoto(value,row,index){
    	var code=row.barCode;
    	var url="barcode/"+code+".png";
    	return "'<img src='"+url+"' style='height: 50px;width: 150px'>'"
    }
    

    4.配置类

    package com.****.energy.nat.config;
    /**
     * @author ascool_zh
     * @create 2021-02-15:27
     */
    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
        //我们配置的磁盘路径,条形码会生成在这里
        @Value("${barcode-filepath}")
        private String barcodeFilepath;
    
    
     //访问静态资源
     @Override
     public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
     //起作用的是这条,告诉spring当我们访问/barcode/**路径时,会被映射到我们的磁盘路径
     registry.addResourceHandler("/barcode/**").addResourceLocations("file:" + barcodeFilepath);
        }
    
    }
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值