[C#] ZEBRA ZPL指令打印BarCode,QRCode

公司业务需要 接触到c#的打印机方面的业务。要求客户端控制打印机来打印条码,二维码。
条码:在条码打印上 在传参方面和排版方面需要去慢慢调试。
二维码:直接指令打印二维码在控制二维码大小很难把控,因为传入的参数不同,二维码的大小也会随之变化,而ZPL指令只又通过改变缩放比例来调节,但是可以通过打印二维码图像来做到对大小的把控,两种方式下面都有提到。
由于网上的案列少 在弄完这个小demo后想把自己的心得分享出来。just no bb,show you my code. 本人不会c#,写的差不要见笑。

首先是引用dll
[C#] ZEBRA ZPL指令打印BarCode,QRCode_第1张图片
#条码(BarCode)打印

主要代码片

            try
            {
               
                //实例化一个打印类
                ZebraPrinter printer = new ZebraPrinter();
                //定义标签值 与拼接的字符串对应
                string code = "L000001";
                string var1 = "物料code:000 0000";
                string var2 = "物料名:123456 ";
                string var3 = "数量:1";
                string var4 = "生成日期:2016/4/5";
                string var5 = "货主:XXXXXX电子有限公司";
                //拼接命令字符串
                code = string.Concat(var1, "^", var2, "^", var3, "^", var4, "^", var5, "~", code);
                string printPath = "TEMPLATE.txt";
                DirectoryInfo dirinfo = new DirectoryInfo(Environment.CurrentDirectory);
                printPath = @"\template\" + printPath;
                printer.PrintLabEx(printPath, code, "GK888t");
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR:" + ex); //此处要打LOG
            }

模板类容

(TEMPLATE.txt) TXT文件!

^XA

^PW2000

^MD30

^LL300

^LH0,0

^PQ1,0,1,Y

#CN_DATA1#;|宋体|20|15|^FO70,90

#CN_DATA2#;|宋体|20|15|^FO70,120

#CN_DATA3#;|宋体|20|15|^FO70,150

#CN_DATA4#;|宋体|20|15|^FO70,180

#CN_DATA5#;|宋体|20|15|^FO70,210

^FO70,0^BY2.0,3.0^BCN,60,Y,N,N,A^FD#ID1#^FS
 
^XZ

介绍

单位:mm
^XA ^XZ  开始和结束
^PW2000 条码宽度
^MD30 条码浓度(-30~30)
^LL300 打印的长度(配合打印机设置里面的打印长度)(传入参数太多打印长度太小会出现打印不全的情况)
^LH0,0 条码纸的边距
^PQ1,0,1,Y 一次打印一张不暂停
#CN_DATA# 变量占位符 
|宋体|20|15| 宋体 高20 宽15
^FO 设置左上角的位置(坐标)
^BY 缩放级别2.0(1~10)粗细柱比例3.0 条码高度60
^BCN code128指令
^FD 打印条码类容
#ID# 条码变量占位符
^FS 换行
传入的参数一定不能大于模板的参数  ^后 接的是字符串参数 ~后接的是code参数
GK88T 局域网打印机名称

#BarCode(二维码)直接zpl打印
主要代码片

       try
            {
                //实例化一个打印类
                ZebraPrinter printer = new ZebraPrinter();
                string printPath = "TEMPLATE2.txt";
                string code = "中文1232111"; //此处传参 QR码
                string var1 = "我是汉字";  //此处传参 文本值
                code = string.Concat(var1, "~", code);
                Console.WriteLine(code);
                DirectoryInfo dirinfo = new DirectoryInfo(Environment.CurrentDirectory);
                printPath = @"\template\" + printPath;
                Console.WriteLine(printPath);
                printer.PrintLabEx(printPath, code, "GK888t");
                //Bullzip PDF Printer  GK888t
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR:" + ex); //此处要打LOG
            }

模板内容

^XA
#CN_DATA1#;|宋体|20|20|^FO1,1
^FO20,20
^BQ,2,10
^CI26
^FH^FDQA,#ID1#^FS
^XZ

介绍

^BQ,2,10 二维码类型 和缩放比例
^CI26 解决中文字符解析不出来
_0A_0D 此字符加入到字符中间可以达到换行效果
其余的基本和上面参数解释一样

#BarCode(二维码)图片zplii打印
这写的二维码image形式打印二维码 条码打印同理
代码片

 string str = "我是中文 你认识我吗";
            string printPath = str + ".png";
            DirectoryInfo dirinfo = new DirectoryInfo(Environment.CurrentDirectory);
            printPath = dirinfo+ @"\QRImages\" + printPath;
            Console.WriteLine(printPath);
            //生成二维码图片  
            try
            {
                String savePath = printPath;
                ImagePrintQrUtilS imagePrintQrUtils = new ImagePrintQrUtilS();
                ImagePrintQrUtilS.CreateQRCodeImage(str, savePath);
                Console.WriteLine("类容:" + GetImageQrZPL.Convert(printPath));
                RawPrinterHelper.SendStringToPrinter("GK888t",GetImageQrZPL.Convert(printPath));
            }
            catch (Exception)
            {

            }
public static System.Drawing.Image CreateQRCodeImage(string num, string path)
        {
            QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
            String encoding = "Byte";
            if (encoding == "Byte")
            {
                qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
            }
            try
            {
                int scale = Int16.Parse("4");  //Convert.ToInt16(4);
                qrCodeEncoder.QRCodeScale = scale;
            }
            catch (Exception)
            {

            }
            try
            {
                int version = Int16.Parse("7");
                qrCodeEncoder.QRCodeVersion = version;
            }
            catch (Exception)
            {

            }

            string errorCorrect = "M";
            if (errorCorrect == "L")
                qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;
            else if (errorCorrect == "M")
                qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
            else if (errorCorrect == "Q")
                qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.Q;
            else if (errorCorrect == "H")
                qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;
            try
            {
                Bitmap bm = qrCodeEncoder.Encode(num,Encoding.UTF8);//+Encoding.UTF8 解决中文乱码!!!!
                bm.Save(path);
                MemoryStream ms = new MemoryStream();
                bm.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                return System.Drawing.Image.FromStream(ms);
            }
            catch (Exception)
            {

            }
            return null;
        }
  public static string Convert(string s_FilePath)
        {
            int b = 0;
            long n = 0;
            long clr;
            StringBuilder sb = new StringBuilder();
            sb.Append("^XA~DGR:ZONE.GRF,");
            Bitmap bm = new Bitmap(s_FilePath);
            int w = ((bm.Size.Width / 8 + ((bm.Size.Width % 8 == 0) ? 0 : 1)) * bm.Size.Height);
            int h = (bm.Size.Width / 8 + ((bm.Size.Width % 8 == 0) ? 0 : 1));

            sb.Append(w.ToString().PadLeft(5, '0') + "," + h.ToString().PadLeft(3, '0') + ",\n");
            using (Bitmap bmp = new Bitmap(bm.Size.Width, bm.Size.Height))
            {
                for (int y = 0; y < bm.Size.Height; y++)
                {
                    for (int x = 0; x < bm.Size.Width; x++)
                    {
                        b = b * 2;
                        clr = bm.GetPixel(x, y).ToArgb();
                        string s = clr.ToString("X");

                        if (s.Substring(s.Length - 6, 6).CompareTo("BBBBBB") < 0)
                        {
                            bmp.SetPixel(x, y, bm.GetPixel(x, y));
                            b++;
                        }
                        n++;
                        if (x == (bm.Size.Width - 1))
                        {
                            if (n < 8)
                            {
                                b = b * (2 ^ (8 - (int)n));

                                sb.Append(b.ToString("X").PadLeft(2, '0'));
                                b = 0;
                                n = 0;
                            }
                        }
                        if (n >= 8)
                        {
                            sb.Append(b.ToString("X").PadLeft(2, '0'));
                            b = 0;
                            n = 0;
                        }
                    }
                }
                sb.Append("^LH0,0^FO5,60^XGR:ZONE.GRF^FS^XZ");
            }
            return sb.ToString();
        }

介绍

这个主要原理是先生成二维码图片再将图片转为zpl指令打印二维码。和打印图片类型条码的同理
若有具体的控制 在 Convert方法中的Append 修改和添加指令  打印中文乱码已解决。

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