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);
        }
    
    }
    
    
    原文作者:歌者_12105
    原文地址: https://blog.csdn.net/weixin_44712105/article/details/113699581
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞