条码打印

最近项目中用到条码打印功能,以往使用code39码字体格式,但由于条码较小打印不下,改用code128码解决。
使用128码开始并不能被识别,查找资料后了解到128码打印需要特殊处理,即需要打印的字符串A,需要经过系列运算 加工成 B,才能被识别。加工过程代码如下(C#代码,其他语言应类似)

    public static string GetCode128Str(string vInStr)
    {
        //临时变量。用来
        int nTemp = 0;
        int[] nChrInstr = null;
        char vInstr_Code128 = ' ';
        char[] vInstrArray = vInStr.ToCharArray();
        for (int i = 0; i < vInstrArray.Length; i++)
        {
            if (i == 0)
            {
                nChrInstr = new int[vInstrArray.Length];
            }
            //将字符转换成ASC码
            nChrInstr[i] = (int)vInstrArray[i];

            //ASC码进行运算,转换字节
            if (nChrInstr[i] >= 32)
            {
                nTemp = nTemp + (vInstrArray[i] - 32) * (i + 1);
            }
            else
            {
                nTemp = nTemp + (vInstrArray[i] + 64) * (i + 1);
            }
        }
        //把每个字符的value值 乘上 字符在字符串中的位置(从1开始算)把每个乘积加起来,
        //因为CODESET B 为104(这是规定不要问我为什么),所以,还要加上104。
        //最后,除以103,所得的余数就是 校验码 的value值,然后在表中找到对应的字符就可以了。

        //注:以上是资料上写的 本人也不是太明白
        int nCode = (nTemp + 104) % 103;

        if (nCode >= 95)
        {
            switch (nCode)
            {
                case 95:
                    vInstr_Code128 = 'Ã';
                    break;
                case 96:
                    vInstr_Code128 = 'Ä';
                    break;
                case 97:
                    vInstr_Code128 = 'Å';
                    break;
                case 98:
                    vInstr_Code128 = 'Æ';
                    break;
                case 99:
                    vInstr_Code128 = 'Ç';
                    break;
                case 100:
                    vInstr_Code128 = 'È';
                    break;
                case 101:
                    vInstr_Code128 = 'É';
                    break;
                case 102:
                    vInstr_Code128 = 'Ê';
                    break;
            }
        }
        else
        {
            nCode = nCode + 32;
            vInstr_Code128 = (char)nCode;
        }

        string vReturnStr = "Ì" + vInStr + vInstr_Code128 + "Î";

        return vReturnStr;
    }

以上为转换过程,已验证可用,具体算法规则 还需后续对128编码规则的定义来理解。
补充:
1、code39需要将打印的串 前后用星号(*)包起来。即需打印传A, 实际打印时需 *A*
2、code128比code39应该更灵活,单位长度里编码密度更高

你可能感兴趣的:(c#)