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

来源:互联网 发布:程序员上班3天被劝退 编辑:程序博客网 时间:2024/06/06 01:58

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

首先是引用dll

条码(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| 宋体 高2015^FO 设置左上角的位置(坐标)^BY 缩放级别2.01~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 修改和添加指令  打印中文乱码已解决。

后记
如果有不了解的或者有错误的地方可以评论留言或者加我qq 294810949交流。
新博客地址 https://yeyafei.github.io/

1 0
原创粉丝点击