最近领导要求写个条码打印程序, 一听就知道又要头疼了
原来的系统是小日本提供的, 领导的意思就是怕以后修改起来麻烦, 所以自己要做个,
涉及的条码是不多, 看了下 就UPC-A 和 CODE39
接下来就要考虑用什么方法实现了,
1.如果用条码控件, 实现打印的时候 通常都比较麻烦, 而且打印效果不佳.
2.Codeproject上搜了几个自己绘制条码的类, 感觉不是很灵活(改变大小是 通常都会出现问题)
3.配合条码字体, 本人就使用了这个方法, 和上次的CODE128 一样, 用字符串转换, 配合字体, 在水晶报表上实现. (个人感觉 这个方法还是比较灵活, 打印也方便实现)
UPC-A 相关知识
粗略来讲, 该条码有5部分组成: 起始符, 左端数据, 中间分隔符, 右端数据, 终止符(校验码)
举例来说:
一条码 : 012345678905
起始符: 0
左端数据: 12345
中间分隔符: 不可见(在本人使用的字体中为 "-" 连字符)
右端数据: 67890
校验码: 5
其中, 校验码 5 的由来, 可以根据前面11个字符计算得出:
0*3 + 1 + 2*3 + 3 + 4*3 + 5 + 6*3 + 7 + 8*3 + 9 + 0*3 = 85
10 – (85%10) = 5
//相比之下, 感觉和CODE128差不多... 由于校验码本来就提供了, 程序中就免去了这步 !
知识就介绍到这里, 由于使用字体实现, 我们还需要一些转换, 我会在下面的代码里给出
核心类:
class UPCA
{
private string _Barcode;
{
private string _Barcode;
#region "--- Conversion Definition ---"
//UPC-A 数据长度12
/*
* 起始符
*
# ----> 0
$ ----> 1
% ----> 2
& ----> 3
' ----> 4
( ----> 5
) ----> 6
* ----> 7
+ ----> 8
, ----> 9
*/
string[] BeginDigits = new string[] { "#", "$", "%", "&", "'", "(", ")", "*", "+", "," };
* 起始符
*
# ----> 0
$ ----> 1
% ----> 2
& ----> 3
' ----> 4
( ----> 5
) ----> 6
* ----> 7
+ ----> 8
, ----> 9
*/
string[] BeginDigits = new string[] { "#", "$", "%", "&", "'", "(", ")", "*", "+", "," };
/*
* 校验码
*
a ----> 0
b ----> 1
c ----> 2
d ----> 3
e ----> 4
f ----> 5
g ----> 6
h ----> 7
i ----> 8
j ----> 9
*/
string[] EndDigits = new string[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" };
* 校验码
*
a ----> 0
b ----> 1
c ----> 2
d ----> 3
e ----> 4
f ----> 5
g ----> 6
h ----> 7
i ----> 8
j ----> 9
*/
string[] EndDigits = new string[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" };
/*
* 右端数据(左端数据无需转换)
*
A ----> 0
B ----> 1
C ----> 2
D ----> 3
E ----> 4
F ----> 5
G ----> 6
H ----> 7
I ----> 8
J ----> 9
*/
string[] ProdID = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" };
* 右端数据(左端数据无需转换)
*
A ----> 0
B ----> 1
C ----> 2
D ----> 3
E ----> 4
F ----> 5
G ----> 6
H ----> 7
I ----> 8
J ----> 9
*/
string[] ProdID = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" };
//分隔符(连字符)
string LinkDigit = "-";
string LinkDigit = "-";
#endregion
public UPCA(string barcode)
{
_Barcode = barcode;
}
{
_Barcode = barcode;
}
public string Barcode()
{
if (string.IsNullOrEmpty(_Barcode) || _Barcode.Length != 12)
{
return string.Empty;
}
else
{
try
{
string beginCode, leftCode, splitCode, rightCode, checkCode, retCode;
{
if (string.IsNullOrEmpty(_Barcode) || _Barcode.Length != 12)
{
return string.Empty;
}
else
{
try
{
string beginCode, leftCode, splitCode, rightCode, checkCode, retCode;
//Get BeginDigit Barcode
beginCode = BeginDigits[System.Convert.ToInt16(_Barcode.Substring(0, 1))];
beginCode = BeginDigits[System.Convert.ToInt16(_Barcode.Substring(0, 1))];
//Get LeftData Barcode
string leftData = _Barcode.Substring(1, 5);
string[] tmpStr = new string[5];
for (int iLoop = 1; iLoop <= 5; iLoop++)
{
tmpStr[iLoop - 1] = leftData.Substring(iLoop - 1, 1);
}
leftCode = string.Join("", tmpStr);
string leftData = _Barcode.Substring(1, 5);
string[] tmpStr = new string[5];
for (int iLoop = 1; iLoop <= 5; iLoop++)
{
tmpStr[iLoop - 1] = leftData.Substring(iLoop - 1, 1);
}
leftCode = string.Join("", tmpStr);
//Get SplitDigit Barcode
splitCode = LinkDigit;
splitCode = LinkDigit;
//Get RightData Barcode
string rightData = _Barcode.Substring(6, 5);
tmpStr = new string[5];
for (int iLoop = 1; iLoop <= 5; iLoop++)
{
tmpStr[iLoop - 1] = ProdID[System.Convert.ToInt16(rightData.Substring(iLoop - 1, 1))];
}
rightCode = string.Join("", tmpStr);
string rightData = _Barcode.Substring(6, 5);
tmpStr = new string[5];
for (int iLoop = 1; iLoop <= 5; iLoop++)
{
tmpStr[iLoop - 1] = ProdID[System.Convert.ToInt16(rightData.Substring(iLoop - 1, 1))];
}
rightCode = string.Join("", tmpStr);
//Get CheckDigit Barcode
checkCode = EndDigits[System.Convert.ToInt16(_Barcode.Substring(11, 1))];
checkCode = EndDigits[System.Convert.ToInt16(_Barcode.Substring(11, 1))];
retCode = beginCode + leftCode + splitCode + rightCode + checkCode;
return retCode;
}
catch (Exception ex)
{
string exStr = ex.Message;
return string.Empty;
}
}
catch (Exception ex)
{
string exStr = ex.Message;
return string.Empty;
}
}
}
}
}
}
附加2个字体....