備忘錄:關於C#生成商品條碼

shanzm發表於2022-02-15

志銘-2022年2月15日 22:15:46

0. 背景說明

在.net程式中生成69碼的條形碼很容易

生成的條形碼使用手機掃碼和掃碼槍都是可以準確的掃描

但是,這次我需要生成69碼的條形碼

可是我發現,我生成的69碼對應的條形碼和超市商品的列印的不一樣,

一般商品上的69碼的條形碼兩邊的和中間的線條都會長出一段的

之前程式中的生成的條形碼都是倉庫和內部使用不需要在意這些細節,

而這次列印的吊牌需要直接展示給使用者,所以需要注意一些細節

一般搜尋.net建立條形碼都是使用Zxing,但是達不到我所期望

最終發現使用字型實現效果極好,而且使用字型在報表中展示時無需要使用圖片,直接使用文字即可

測試了三種方法,將三種方法記錄於此

1. 使用ZXing.NET

PM>Install-Package ZXing.Net -Version 0.16.8


using ZXing;
using ZXing.Common;

/// <summary>
/// 使用ZXing建立條形碼
/// </summary>
/// <param name="barCode">條碼</param>
/// <param name="height">高度</param>
/// <param name="width">寬度</param>
/// <returns>Bitmap圖片</returns>
public static Bitmap GenerateBarCodeByZXing(string barCode,string height=310,string width=120)
{
    EncodingOptions encoding = new EncodingOptions()
    {
        GS1Format = true,
        Height = height,//設定一維碼寬高
        Width = widht,
        Margin = 0,//圖片空白邊距
        PureBarcode = false//在條碼下顯示條碼,true則不顯示
    };

    //生成條形碼的圖片
    BarcodeWriter wr = new BarcodeWriter()
    {
        //進行指定規格
        Options = encoding,
        Format = BarcodeFormat.EAN_13 // BarcodeFormat.CODE_128// 
    };

    Bitmap img = wr.Write(barCode);//生成一維碼圖片
    return img;
}



2. 使用BarcodeLib

PM>Install-Package BarcodeLib -Version 2.4.0


using BarcodeLib;


/// <summary>
/// 使用BarcodeLib生成條形碼
/// </summary>
/// <param name="barCode">內容</param>
/// <returns></returns>
public static Image GenerateBarCodeByBarcodeLib(string barCode)
{
    Barcode barcode = new Barcode()
    {
        IncludeLabel = true,//是否包含圖片下面的文字資訊
        Alignment = AlignmentPositions.CENTER,//一維碼在圖片居中
        Width = 250,
        Height = 100,
        RotateFlipType = RotateFlipType.RotateNoneFlipNone,//影像反轉
        BackColor = Color.White,//背景色
        ForeColor = Color.Black,//前景色
    };


    return barcode.Encode(TYPE.EAN13, barCode);
}


3. 使用字型

internal class EAN13Class
{
    public static string Barcode13Digits = "";
    /// <summary>
    /// 12位條碼補齊校驗位生成13位的條碼
    /// </summary>
    /// <param name="chaine"></param>
    /// <returns></returns>
    public static string EAN13(string chaine)
    {
        int i;
        int first;
        int checkSum = 0;
        string Barcode = "";
        bool tableA;
        if (Regex.IsMatch(chaine, "^\\d{12}$"))
        {
            for (i = 1; i < 12; i += 2)
            {
                System.Diagnostics.Debug.WriteLine(chaine.Substring(i, 1));
                checkSum += Convert.ToInt32(chaine.Substring(i, 1));
            }
            checkSum *= 3;
            for (i = 0; i < 12; i += 2)
            {
                checkSum += Convert.ToInt32(chaine.Substring(i, 1));
            }
            chaine += (10 - checkSum % 10) % 10;
            Barcode13Digits = chaine.ToString();
            Barcode = chaine.Substring(0, 1) + (char)(65 + Convert.ToInt3(chaine.Substring(1, 1)));
            first = Convert.ToInt32(chaine.Substring(0, 1));
            for (i = 2; i <= 6; i++)
            {
                tableA = false;
                switch (i)
                {
                    case 2:
                        if (first >= 0 && first <= 3)
                        {
                            tableA = true;
                        }
                        break;
                    case 3:
                        if (first == 0 || first == 4 || first == 7 || first== 8)
                        {
                            tableA = true;
                        }
                        break;
                    case 4:
                        if (first == 0 || first == 1 || first == 4 || first== 5 || first == 9)
                        {
                            tableA = true;
                        }
                        break;
                    case 5:
                        if (first == 0 || first == 2 || first == 5 || first== 6 || first == 7)
                        {
                            tableA = true;
                        }
                        break;
                    case 6:
                        if (first == 0 || first == 3 || first == 6 || first== 8 || first == 9)
                        {
                            tableA = true;
                        }
                        break;
                }
                if (tableA)
                {
                    Barcode += (char)(65 + Convert.ToInt32(chaine.Substrin(i, 1)));
                }
                else
                {
                    Barcode += (char)(75 + Convert.ToInt32(chaine.Substrin(i, 1)));
                }
            }
            Barcode += "*";
            for (i = 7; i <= 12; i++)
            {
                Barcode += (char)(97 + Convert.ToInt32(chaine.Substring(i, 1));
            }
            Barcode += "+";
        }
        return Barcode;
    }
}
string Check12Digits = txtForFont.Text.PadRight(12, '0');//不足12位用0總右側補齊
string Barrcode = EAN13Class.EAN13(Check12Digits);
labForFont.Text = Barrcode;


4. 參考

C# Programming How to Create EAN-13 Barcode Generator

相關文章