最近因为公司项目的需要,研究了一项对我来说算是新的技术— 条形码的生成和打印 。因为之前没有接触过这方面的知识,所以刚开始还有点小迷茫和小兴奋,不过一步一步来,问题总会解决的。现在来总结一下做条形码这块的收获。

条形码的生成没有什么难度,就是运用一些字符串处理函数自动生成一串字母或数字的组合。这里主要说明一下如何把生成的条码值打印出来。首先我们要接触一种新的语言 ZPL ZebraProgramming Language )看名字 zebra 就知道和斑马有关;的确, ZPL 是斑马公司自主设计的语言(斑马公司的业务主要是制作斑马条形码打印机)。现在大部分条码打印机都是可以识别 ZPL 指令的,我们可以用 ZPL 指令编写一个模板,然后将自动生成的条形码值(字符串)按照一定格式格式化成新的字符串。然后将这些内容传入打印机即可。

下面来举个 Demo 说明一下具体的操作:

这是我编写好的一个模板:(名称为 Barcode Path ,保存格式为.TXT或者.PRN格式,而且一定要注意是大写!!

---------------------------------------------------------------------------------------------------------

^PW 1000

^MD 30

^LH 0,0

#CN_DATA1# ;|宋体|20|15|^FO150,0

#CN_DATA2# ;|宋体|20|15|^FO650,0

^FO 70,0 ^BY 2.0,3.0 ^BCN ,120,Y,N,N,A ^FD #ID1#^FS

^FO570,0^BY2.0,3.0^BCN,120,Y,N,N,A^FD#ID2# ^FS

^PQ1,0,1,Y

ZPL语言还是很好理解的,都是一些固定的指令,了解就行。

---------------------------------------------------------------------------------------------------------

^XA ^XZ 分别代表一个指令块的开始和结束, 是固定的东西。

^PW 打印宽度,如果宽度较小,则会出现打印不全的效果。

^MD 设置标签颜色的深度,取值范围为 -30 to 30,上面的指令将颜色调到了最深。

^LH 设置条码纸的边距,本模板未进行设置。

---------------------------------------------------------------------------------------------------------

以下以字符串abc^edf~L000001^L000002为例进行说明 (abc、edf分别为汉字,L000001、L000002为条形码值)

#CN_DATA1# 为abc的占位符。

#CN_DATA2# 为edf的占位符。

|宋体|20|15| 指字体为宋体,字符高度为20,宽度为15

^FO 设置条码左上角的位置的坐标(70,0)。

^BY 设置条形码显示样式, 这是该模板最重要的一个部分, 2.0是条码的缩放级别(可接受的数值:1-10点 ),这个数值下打出的条码很小, 3.0是条码中粗细柱的比例(可接受的数值:2.0到3.0,增量0.1,对固定比例的条码无效 ), 120是条码高度。

^BCN 是打印code128的指令。

^FD: 设置要打印的内容

^FS: 表示换行

#ID1#: 指L000001

#ID2#: 指L000002

---------------------------------------------------------------------------------------------------------

^PQ50,10,1,Y:打印总数50张标签每个序列号只打一张。打印每组数量是10,但在每组间不暂停。

^PQ50,10,1,N:打印总数50张标签每个序列号只打一张。打印每数量是10,每组打印后暂停。

这里可以写成 ^PQ1,0,1,Y ,即每次打印一张,不暂停。因为打印总张数可以在程序中进行控制。

---------------------------------------------------------------------------------------------------------

建议:编写模板需要自己尝试,可以先编写一个打印的demo,根据打印出来的效果,不断的调试改动模板,以达到预期的效果。

模板讲到这里应该就差不多了。下面说明如何进行打印。

首先需要引入一个封装好的DLL文件 SMT.ZEBRA.dll ,打印操作主要就是靠它来完成的,在他内部封装了一个ZebraPrinter类,包含方法PrintLabEx

        //     说明:
        //     打印条形码、RFID等类型标签
        //   参数:
        //   n_strTemplateFilePath:
        //     标签模版文件名称,不含路径,如:"TEMPLATE.TXT"
        //   n_strLabels:
        //     标签数据集合字符串,多个标签行用'|'分割,单个标签行数据内部用'^'(字段)分割或'~'(文字或条码)分割, 如"研发部^51296829~8019^8020|11G~51296829^8001^8012"注明了如下打印要点:
        //     1. 打印两行标签(俗称两枚) 2. 第一行标签打印两个文本("研发部"、"51296829"),2个条形码(分别是"8019"、"8020")
        //     3. 第二行标签打印1个文本("11G"),3个条形码("51296829"、"8001"、"8012")
        //   n_strPrinterName:
        //     打印机名称等,比如"ZDesigner 888-TT"
public bool PrintLabEx(string n_strTemplateFilePath, string n_strLabels, string n_strPrinterName);

客户端代码:

        private void button1_Click(object sender, EventArgs e)
                //实例化一个打印类
                ZebraPrinter printer = new ZebraPrinter();
                //定义两个标签值
                string str1 = "L000001";
                string str2 = "L000002";
                //按照格式,格式化成新的字符串
                str1 = string.Concat(" ", "^", " ", "~", str1, "^", str2);   //双排条形码
                //str = string.Concat(" ", "~", str);      //单排条形码
                //printPath:模板名称
                //comboBox1.Text:打印机名称
                string printPath = "BarcodePath.TXT";
                printer.PrintLabEx(printPath, str1, comboBox1.Text);
            catch (Exception ex)
                MessageBox.Show(ex.Message);
        private void SmtZebraWinFormZPL_Load(object sender, EventArgs e)
            //获取本地计算机上安装的所有打印机,保存到集合strCollects中
            PrinterSettings.StringCollection strCollects = PrinterSettings.InstalledPrinters;
            string strPrinterName = string.Empty;
            //遍历集合,将所有打印机加载到下拉列表comboBox1中
            foreach (String strName in strCollects)
                strPrinterName = strName.ToString();
                comboBox1.Items.Add(strPrinterName);
            comboBox1.SelectedIndex = 0x00;



打印效果:

                

有问题的地方欢迎指出!

                                           oノo═══════════════════════╲

                                            │ヽ.编程学习ing....  欢迎交流。                             │

                                            │   http://blog.csdn.net/u010028869                  .ヽ│

                                             ╲═══════════════ヾ

准备:1. 斑马打印机 型号GT820。 2. 斑马打印机驱动。 3. 库文件SMT.ZEBRA.dll 和 SMT.ZEBRA.dll的依赖库文件Fnthex32.dll。 步骤:1。调试打印机,安装支持打印机的ZPL驱动(因为所打印标签的模板使用ZPL指令编写的,所以必须选择ZPL)。 打印机属性->测试页,打印成... 对于直接使用ZPL命令打印中文,首先需要明确几个概念: 1.码表文件: 字符编码文件,打印中文需要制定的码表,常用中文码表为 GB.DAT,GB8BIT.DAT,GB2312.DAT,GB18030.DAT, 其中 GB.DAT,GB8BIT.DAT为较早的机型使用编码表文件,码... StringBuilder builder = new StringBuilder(); builder.AppendLine("^XA"); //指令块的开始 builder.AppendLine("^MMC,Y"); builder.... 这个问题是我最近在跑一个深度学习项目时遇到的,当时还以为是源码有问题,最后Google查到是因为操作系统保留字的原因,特此记录一下。在Windows系统中,以Win10为例,有时会发现将一些文件进行重命名的时候会出现“指定的设备名无效”的情况,如果你有此类问题,看看是否使用了 aux,com1,com2,prn,con,nul 这些名称! 1. 原因 因为这些关键词是 Windows 操作系统定义的设备名称,是保留关键字,不允许使用。发现不能使用的关键词有如下几个: 2. 解决方法 将该文件重命名即可解决 你在这里因为你有,有一个文件扩展名结尾的​​文件.prn.文件与文件扩展名.prn只能通过特定的应用程序推出。这有可能是.prn文件是数据文件,而不是文件或媒体,这意味着他们并不是在所有观看。什么是一&nbsp.prn&nbsp文件?在PRN格式文件是由打印对话框中选择“打印到文件”创建通用的文件。在此格式的文件可以含有图像,文本,图表,表格和要打印的其他内容。通过此相... ------------61301EA571264FContent-Type: text/plain; charset=Windows-1251Content-Transfer-Encoding: 8bitHello all,Extract archive and compile Audio Plugin "IntelCodecs" in MS VisualStudio .NET 2003. To... 一、填空题1、计算计的软件系统通常分成 软件和 软件。2、字长是计算机 次能处理的 进制位数。3、1KB= B;1MB= KB。4、计算机中,中央处理器CPU由 和 两部分组成。5、CPU按指令计数器的内容访问主存,取出的信息是 ;按操作数地址访问主存,取出的信息是 。6、磁盘上各磁道长度不同,每圈磁道容量 ,内圈磁道的存储密度 外圈磁道的存储密度。7、完整的磁盘文件名由 和 组成。8、每张磁盘只...