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