备忘录:关于C#生成商品条码
志铭-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. 使用字体
-
这是参考一个YouTube Up主的方法,视频连接见参考链接
-
首先在程序安装的机器上安装:ean13.ttf字体
-
关于69码原理
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;