【barcode】基於barcode4j開源庫生成條形碼

一維條碼(條形碼)市場需要還是很多的,用於物流、食品、醫療等業務方面很廣泛。


源碼在github:https://github.com/lgc592519828/BAR-QR-CODE

所以對於生成條碼類庫很多,比如barcode4j,Jbarcode,google-zxing。
目前實現了兩種,先上代碼:

Barcode4j

  • pom.xml
<dependency>
      <groupId>net.sf.barcode4j</groupId>
      <artifactId>barcode4j</artifactId>
      <version>2.1</version>
</dependency>
import org.apache.commons.lang.StringUtils;
import org.krysalis.barcode4j.HumanReadablePlacement;
import org.krysalis.barcode4j.impl.code128.Code128Bean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.tools.UnitConv;

import java.awt.image.BufferedImage;
import java.io.*;

/**
 * @author gcheng.L
 * @create 2019-03-23 18:46
 */
public class BarcodeUtil_barcode4j {


    /**
     * 已生成code128條形碼爲例
     * @param msg           要生成的文本
     * @param hideText      隱藏可讀文本
     * @param ous
     */
    public static void generateBarCode(String msg, boolean hideText, OutputStream ous) {
        try {
            if (StringUtils.isEmpty(msg) || ous == null) {
                return;
            }

            // 如果想要其他類型的條碼(CODE 39, EAN-8...)直接獲取相關對象Code39Bean...等等
            Code128Bean bean = new Code128Bean();
            // 分辨率:值越大條碼越長,分辨率越高。
            int dpi = 150;
            // 設置兩側是否加空白
            bean.doQuietZone(true);
            // 設置條碼每一條的寬度
            // UnitConv 是barcode4j 提供的單位轉換的實體類,用於毫米mm,像素px,英寸in,點pt之間的轉換
            bean.setModuleWidth(UnitConv.in2mm(3.0f / dpi));

            // 設置文本位置(包括是否顯示)
            if (hideText) {
                bean.setMsgPosition(HumanReadablePlacement.HRP_NONE);
            }
            // 設置圖片類型
            String format = "image/png";

            BitmapCanvasProvider canvas = new BitmapCanvasProvider(ous, format, dpi,
                    BufferedImage.TYPE_BYTE_BINARY, false, 0);

            // 生產條形碼
            bean.generateBarcode(canvas, msg);

            // 結束
            canvas.finish();
            ous.close();
        } catch (IOException ie) {
            ie.getStackTrace();
        }
    }


    /**
     * 生成條碼文件
     * @param msg
     * @param hideText
     * @param path
     * @return
     */
    public static File generateFile(String msg, boolean hideText,String path) {
        File file = new File(path);
        try {
            generateBarCode(msg, hideText, new FileOutputStream(file));
        } catch (FileNotFoundException fe) {
            throw new RuntimeException(fe);
        }
        return file;
    }

    /**
     *  生成條碼字節
     * @param msg
     * @param hideText
     * @return
     */
    public static byte[] generateByte(String msg, boolean hideText) {
        ByteArrayOutputStream ous = new ByteArrayOutputStream();
        generateBarCode(msg, hideText, ous);
        return ous.toByteArray();
    }

}

效果如圖:

1
barcode4j_01

2
barcode4j_02

3
barcode4j_03

補充說一下區別:總的來說,三張效果都差不多,主要區別在
bean.doQuietZone(true); UnitConv.in2mm(3.0f / dpi) 屬性設定的上

  • 第一張跟第二、三區別就是UnitConv.in2mm(3.0f / dpi) 值設置的小,每一條寬度不同。
  • 第三張跟第一、二區別就是bean.doQuietZone(true) 設置留有空白

其實這只是簡單的實現,有很多屬性可供選擇,不一一列舉了, 提供官方文檔:
http://barcode4j.sourceforge.net/trunk/javadocs/index.html

而且對於條碼樣式的選擇,符合自己項目業務就好,但要注意一點,條碼生成是有規範的,尤其是想自定義英文字母添加在條碼內的情況,掃碼硬件設備是不支持自定義情況的,要結合實際選擇條碼類型。

另外提供條碼類型選擇圖片:

在這裏插入圖片描述
百度百科提供條碼選擇文檔:https://jingyan.baidu.com/article/20b68a8891b75e796cec62ab.html


下一篇會根據Jbarcode開源庫生成條碼,另外有些業務需求會在條碼下添加文字備註信息,也做了處理。Jbarcode開源庫生成條碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章