以字符串生成条码(UPC-A 非绘制, 需要条码字体)

最近领导要求写个条码打印程序, 一听就知道又要头疼了
 
原来的系统是小日本提供的, 领导的意思就是怕以后修改起来麻烦, 所以自己要做个,
 
涉及的条码是不多, 看了下 就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 �C (85%10) = 5
 
//相比之下, 感觉和CODE128差不多... 由于校验码本来就提供了, 程序中就免去了这步 !
 
 
知识就介绍到这里, 由于使用字体实现, 我们还需要一些转换, 我会在下面的代码里给出
 
核心类:
 
    class UPCA
    {
        private string _Barcode;
        #region "--- Conversion Definition ---"
        //UPC-A 数据长度12
        /*
         * 起始符
         *
         #  ---->  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[] ProdID = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" };
        //分隔符(连字符)
        string LinkDigit = "-";
        #endregion
        public UPCA(string 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;
                    //Get BeginDigit Barcode
                    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);
                    //Get SplitDigit Barcode
                    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);
                    //Get CheckDigit Barcode
                    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;
                }
            }
        }
    }
附加2个字体....

你可能感兴趣的:(职场,休闲,条码,UPC-A)