• C#-利用ZPL语言完毕条形码的生成和打印


    

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

     

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

    以下来举个Demo说明一下详细的操作:

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

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

    ^XA

    ^PW1000

    ^MD30

    ^LH0,0

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

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

    ^FO70,0^BY2.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

    ^XZ

    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);
    

    client代码:

            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    //实例化一个打印类
                    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                  .ヽ│

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

     

  • 相关阅读:
    今天地震了(有震感)...
    上班了!
    C++ 中explicit的作用
    DoModal 函数的用法
    [导入]C++ GUi 选择
    [导入]C++资源之不完全导引(完整版)[转]
    [导入]The GUI Toolkit, Framework Page
    [导入]C/C++中调用SQLITE3的基本步骤
    ACM
    牛客NOIP暑期七天营提高组5+普及组5
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4360692.html
Copyright © 2020-2023  润新知