C# 条形码 生成函数 (Code 128 标准参考:GB/T 18347-2001)

最近在做单据打印,发现客户要求用到条形码,在网上找了,发现只有一些条形码的标准,但打出来发现根本不能扫,还要加某些字体.

 
以下代码经过实际扫描测试~!
  
    /// <summary>
 
    /// 生成条形码( 128条码,标准参考:GB/T 18347-2001 )
 
    /// BY JUNSON 20090508
 
    /// </summary>
 
    public class BarCode
 
    {
 
        /// <summary>
 
        /// 条形码生成函数
 
        /// </summary>
 
        /// <param name="text">条型码字串</param>
 
        /// <returns></returns>
 
        public static Bitmap BuildBarCode(string text)
 
        {
 
            //查检是否合条件TEXT
 
            bool ck = CheckErrerCode(text);
 
            if (!ck)
 
                throw new Exception("条形码字符不合要求,不能是汉字或全角字符");
 
            string barstring = BuildBarString(text);
 
            return KiCode128C(barstring, 30);
 
        }
 
        /// <summary>
 
        /// 建立条码字符串
 
        /// </summary>
 
        /// <param name="tex">条码内容</param>
 
        /// <returns></returns>
 
        private static string BuildBarString(string tex)
 
        {
 
            string barstart = "bbsbssbssss";    //码头
 
            string barbody = "";                //码身
 
            string barcheck = "";               //码检
 
            string barend = "bbsssbbbsbsbb";    //码尾
 
            int checkNum = 104;
 
            //循环添加码身,计算码检
 
            for (int i = 1; i <= tex.Length; i++)
 
            {
 
                int index = (int)tex[i - 1] - 32;
 
                checkNum += (index * i);
 
                barbody += AddSimpleTag(index);//加入字符值的条码标记
 
            }
 
            //码检值计算
 
            barcheck = AddSimpleTag(int.Parse(Convert.ToDouble(checkNum % 103).ToString("0")));
 
            string barstring = barstart + barbody + barcheck + barend;
 
            return barstring;
 
        }
 
        //增加一个条码标记
 
        private static string AddSimpleTag(int CodeIndex)
 
        {
 
            string res = "";
 
            /// <summary>1-4的条的字符标识 </summary>
 
            string[] TagB ={ "", "b", "bb", "bbb", "bbbb" };
 
            /// <summary>1-4的空的字符标识 </summary>
 
            string[] TagS ={ "", "s", "ss", "sss", "ssss" };
 
            string[] Code128List = new string[] {
 
                "212222","222122","222221","121223","121322","131222","122213","122312","132212","221213",
 
                "221312","231212","112232","122132","122231","113222","123122","123221","223211","221132",
 
                "221231","213212","223112","312131","311222","321122","321221","312212","322112","322211",
 
                "212123","212321","232121","111323","131123","131321","112313","132113","132311","211313",
 
                "231113","231311","112133","112331","132131","113123","113321","133121","313121","211331",
 
                "231131","213113","213311","213131","311123","311321","331121","312113","312311","332111",
 
                "314111","221411","431111","111224","111422","121124","121421","141122","141221","112214",
 
                "112412","122114","122411","142112","142211","241211","221114","413111","241112","134111",
 
                "111242","121142","121241","114212","124112","124211","411212","421112","421211","212141",
 
                "214121","412121","111143","111341","131141","114113","114311","411113","411311","113141",
 
                "114131","311141","411131","211412","211214","211232" };
 
            string tag = Code128List[CodeIndex];
 
            for (int i = 0; i < tag.Length; i++)
 
            {
 
                string temp = "";
 
                int num = int.Parse(tag[i].ToString());
 
                if (i % 2 == 0)
 
                {
 
                    temp = TagB[num];
 
                }
 
                else
 
                {
 
                    temp = TagS[num];
 
                }
 
                res += temp;
 
            }
 
            return res;
 
        }
 
        /// <summary>
 
        /// 检查条形码文字是否合条件(不能是汉字或全角字符)
 
        /// </summary>
 
        /// <param name="cktext"></param>
 
        /// <returns></returns>
 
        private static bool CheckErrerCode(string cktext)
 
        {
 
            foreach (char c in cktext)
 
            {
 
                byte[] tmp = System.Text.UnicodeEncoding.Default.GetBytes(c.ToString());
 
                if (tmp.Length > 1)
 
                    return false;
 
            }
 
            return true;
 
        }
 
        /// <summary>生成条码 </summary>
 
        /// <param name="BarString">条码模式字符串</param> //Format32bppArgb
 
        /// <param name="Height">生成的条码高度</param>
 
        /// <returns>条码图形</returns>
 
        private static Bitmap KiCode128C(string BarString, int _Height)
 
        {
 
            Bitmap b = new Bitmap(BarString.Length, _Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
 
            //using (Graphics grp = Graphics.FromImage(b))
 
            //{
 
            try
 
            {
 
                char[] cs = BarString.ToCharArray();
 
                for (int i = 0; i < cs.Length; i++)
 
                {
 
                    for (int j = 0; j < _Height; j++)
 
                    {
 
                        if (cs[i] == 'b')
 
                        {
 
                            b.SetPixel(i, j, Color.Black);
 
                        }
 
                        else
 
                        {
 
                            b.SetPixel(i, j, Color.White);
 
                        }
 
                    }
 
               }
 
                //grp.DrawString(text, SystemFonts.CaptionFont, Brushes.Black, new PointF(leftEmpty, b.Height - botEmpty));
 
                return b;
 
            }
 
            catch
 
            {
 
                return null;
 
            }
 
            //}
 
        }
 
    }

C# 条形码 生成函数 (Code 128 标准的更多相关文章

  1. Code 128 规则解析

    1.CODE 128 标准 1.1 code 128码格式:   格式:   从左起: 空白区域,起始字符(Start),数据区域(data),校验码(check),结束字符(Stop),空白区域. ...

  2. 常见条码类型介绍(Code 39、Code 128、EAN-8、EAN-13、EAN-128、ISSN、TIF、TIF-14、UPC(A)、UPC(E))

    常见条码类型,如下: 1.Code 39 Code 39,又称为"Code 3 of 9",是非零售市场中最常用的格式,用于盘存和跟踪.Code 39码编码规则简单,误码率低.所能 ...

  3. 一维码Code 128简介及其解码实现(zxing-cpp)

    一维码Code 128:1981年推出,是一种长度可变.连续性的字母数字条码.与其他一维条码比较起来,相对较为复杂,支持的字元也相对较多,又有不同的编码方式可供交互运用,因此其应用弹性也较大. Cod ...

  4. (zxing.net)一维码Code 128的简介、实现与解码

    一.简介 一维码Code 128:1981年推出,是一种长度可变.连续性的字母数字条码.与其他一维条码比较起来,相对较为复杂,支持的字元也相对较多,又有不同的编码方式可供交互运用,因此其应用弹性也较大 ...

  5. GitHub上传不了的解决 ssh: connect to host github.com port 22: Bad file number git did not exit cleanly (exit code 128)

    问题情况 本来一直用的是github的客户端,结果现在上传的时候出问题了,去网站上看,新项目已经创建,但是代码却怎么都上传不上去.于是只好用命令行的方式解决. Tortoisegit上是这样说的: g ...

  6. [Jenkins][git]构建时提示Caused by: hudson.plugins.git.GitException: Command "/usr/bin/git reset --hard" returned status code 128:

    --------------------- 如需转载,转载请注明出处. --------------------- 今日发现所有IOS构建相关的job全部失败,并提示如下错误: ERROR: Erro ...

  7. 解决git did not exit cleanly (exit code 128)

    最近在用git提交代码到部门服务器上的时候,总是有 提示 git did not exit cleanly (exit code 128).网上有2种解决方式: 1.替换路径 1.鼠标右键 -> ...

  8. ERROR: gnu-config-native-20150728+gitAUTOINC+b576fa87c1-r0 do_unpack: Function failed: Fetcher failure: Fetch command failed with exit code 128, output: fatal: the '--set-upstream' option is no longer

    /********************************************************************** * ERROR: gnu-config-native-2 ...

  9. git did not exit cleanly (exit code 128)

    github,pull和push的时候出问题,提示git did not exit cleanly (exit code 128) 使用HTTP格式的url,不要使用SSH格式的url,在官网上赋值下 ...

随机推荐

  1. HDU4908——BestCoder Sequence(BestCoder Round #3)

    BestCoder Sequence Problem DescriptionMr Potato is a coder.Mr Potato is the BestCoder.One night, an ...

  2. Python之数据结构篇

    简介: 数据结构是可以处理一些数据的结构,或者说,他们是用来存储一组相关数据的.在python中有三种内建的数据结构,分别是列表.元组合字典.我们将会学习如何使用它们是编程变得简单. 列表 list是 ...

  3. JavaScript动态操作style

    1.易错:修改元素的样式不是设置class属性,而是className属性.class是JS的一个保留关键字. 2.易错:单独修改样式的属性使用"style.属性名"3.注意在cs ...

  4. P127、面试题20:顺时针打印矩阵

    题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字.例如:如果输入如下矩阵:1  2  3  4 5  6  7  89  10  11  1213  14  15  16则依次打印出 ...

  5. SOA基础

    每个系统上都有多种业务逻辑,这就像在一个小超市中,一个人负责收银.清洁.摆货.咨询等各种各样的事情,当来超市的顾客多到一定程度,这个人就没办法再负责这么多的事情了,系统也同样如此. 第一个现象就是系统 ...

  6. request对象常用API 获取请求参数的值 request应用 MVC设计模式

    1 request对象常用API   1)表示web浏览器向web服务端的请求   2)url表示访问web应用的完整路径:http://localhost:8080/day06/Demo1     ...

  7. Oracle中Blob和Clob类型的区别与操作

    Oracle中Blob和Clob类型 1.Oracle中Blob和Clob类型的区别 BLOB和CLOB都是大字段类型,BLOB是按二进制来存储的,而CLOB是可以直接存储文字的.其实两个是可以互换的 ...

  8. linux 查看系统信息命令

    linux 查看系统信息命令是linux初学者必备的基础知识, 这些命令也非常有用, 因为进入linux第一件事就可能是首先查看系统信息, 因此必要的系统的学习一下这些linux系统信息命令还是非常有 ...

  9. Mac修改用户名

    Mac 修改用户是一件很悲剧的事,因为牵涉到很多地方的修改,当然,如果只是需要满足登陆用户名的修改的话,就比较简单.而如果需要将某个用户在每一个地方显示的名字都改掉的话,就要修改不是地方了,下面就来讲 ...

  10. Vim Vundle 插件管理器

    /********************************************************************** * Vim Vundle 插件管理器 * 说明: * 话 ...