• 条码(一)一维码生成技术


    Java条形码生成技术

    背景

    目前二维码的应用场景已经遍布各类互联网平台,通常是将产品/商品的唯一编号存储于二维码中以做扫码识别。
    而用于生产环境的条形码技术仍然存在,如硬件设备制造、供应、物流运输等等。
    在常见的产品信息管理、物料订单系统中,存在多个生成及打印条形码(一维码)的需求场景。

    解决方案

    Java生成条形码的方案 -- barcode4j、zxing

    barcode4j

    barcode4j开源Java条形码生成库。支持多种编码格式,比如:code-39,code-128等
     

    zxing

    是由google开源的1D/2D编解码类库。目标是能够对QR编码、Data Matrix、UPC的1D条形码进行解码。 其提供了多种平台下的客户端包括:J2ME、J2SE和Android
     
    本次采用了barcode4j作为解决方案

    环境准备

    下载barcode4j-light
    barcode4j 依赖的lib包略显臃肿,其中包括了avalon-framework/servelet-api,
    因此本次选择的是轻量级的版本barcode4j-light
     
    maven地址
     
    1
    2
    3
    4
    5
    <dependency>
    <groupId>net.sf.barcode4j</groupId>
    <artifactId>barcode4j-light</artifactId>
    <version>2.0</version>
    </dependency>

      

    //另外,也可以下载barcode4j-bin包
     
     

    代码实例

    BarcodeUtil工具类
     
    
    
    import org.apache.commons.lang3.StringUtils;
    import org.krysalis.barcode4j.impl.code39.Code39Bean;
    import org.krysalis.barcode4j.impl.upcean.EAN13Bean;
    import org.krysalis.barcode4j.impl.upcean.EAN8Bean;
    import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
    import org.krysalis.barcode4j.tools.UnitConv;

    import java.awt.image.BufferedImage;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.OutputStream;

    /**
    * 条形码工具类
    * barcode4j开源Java条形码生成库。支持多种编码格式,比如:code-39,code-128等
    http://barcode4j.sourceforge.net/
    */
    public class BarCode4J {
    /**
    * 生成文件
    */
    public static File generateFile(String msg,String path){
    File file=new File(path);
    try{
    generate(msg,new FileOutputStream(file));
    }catch (Exception e){
    e.printStackTrace();
    }
    return file;
    }

    /**
    * 生成字节
    */
    public static byte[] generate(String msg){
    ByteArrayOutputStream ous= new ByteArrayOutputStream();
    generate(msg,ous);
    return ous.toByteArray();
    }

    /**
    * 生成到流
    */
    public static void generate(String msg, OutputStream outputStream){
    if (StringUtils.isEmpty(msg)||outputStream==null){
    return;
    }
    // Code39Bean bean=new Code39Bean();//选择条形码类型(好多类型可供选择)
    EAN13Bean bean=new EAN13Bean();  //商品条码一般用EAN13
    //精细度
    final int dpi=100;//dpi 生成图片像素(默认300)
    //module宽度
    final double moduleWidth= UnitConv.in2mm(1.0f/dpi);
    //配置对象
    bean.setModuleWidth(moduleWidth);//宽
    // bean.setBarHeight(15);//高默认15
    // bean.setWideFactor(3);////条形码间距默认3
    bean.doQuietZone(true);//是否留两边空白
    bean.setQuietZone(3);//如果是留空白,留两边空白的像素
    // bean.setFontSize(0);//是否显示文字信息
    String format="image/png";
    try{
    //输出到流
    BitmapCanvasProvider canvasProvider=new BitmapCanvasProvider(outputStream
    ,format,dpi, BufferedImage.TYPE_BYTE_BINARY,false,0);
    //生成条形码
    bean.generateBarcode(canvasProvider,msg);
    canvasProvider.finish();//结束绘制
    }catch (Exception e){
    throw new RuntimeException(e);
    }
    }
    public static void main(String[] args) {
    String msg = "6935284412918";
    String path = "barcode.png";
    generateFile(msg, path);
    }
    }
     

     运行结果:

     微信扫一扫,将显示商品详细信息

    FAQ

    二维码相对于条形码的优势

       数据容量更大;超越了字母数字的限制;具有抗损毁能力

    关于条形码的各种编码格式
     
     
     
    如何生成或识别二维码
    推荐使用ZXing项目  https://github.com/zxing/zxing
  • 相关阅读:
    NOI2005 聪聪和可可
    CodeVS 1344 线型网络
    BZOJ 2466: [中山市选2009]树
    BZOJ 3827: [Poi2014]Around the world
    BZOJ 1109: [POI2007]堆积木Klo
    BZOJ 2124: 等差子序列
    BZOJ 4544: 椭圆上的整点
    BZOJ 2342: [Shoi2011]双倍回文
    BZOJ 2084: [Poi2010]Antisymmetry
    BZOJ 3111: [Zjoi2013]蚂蚁寻路
  • 原文地址:https://www.cnblogs.com/youqc/p/14438054.html
Copyright © 2020-2023  润新知