C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指

时间:2022-06-17 07:01:12

在批量打印商品标签时一般都要加上条码或图片,而这类应用大多是使用斑马打印机,所以我也遇到了怎么打印的问题。

一种办法是用标签设计软件做好模板,在标签设计软件中打印,这种办法不用写代码,,但对我来说觉得不能接受,所以尝试代码解决问题。

网上搜索一番,找不到什么资料,基本都是说发送ZPL、EPL指令到打印机,而且还是COM/LPT口连接打印机。后来研究.net的打印类库,发现是用绘图方式打印至打印机的,也叫GDI打印,于是思路有了点突破,那我可以用报表工具画好标签,运行报表时,把结果输出位图,再发送至打印机。

后来又找到一种更好的办法,利用标签设计软件做好模板,打印至本地文件,把其中的ZPL、EPL指令拷贝出来,替换其中动态变化的内容为变量名,做成一个模板文本,在代码中动态替换变量,再把指令输出至打印机。

折腾了几天,终于把这两种思路都实现了,顺便解决了USB接口打印机的ZPL、EPL指令发送问题。

今天有点困,改天再详细讲解一下这两种思路的具体实现。

==============================================================================================================
如何获取标签设计软件输出至打印的ZPL指令?安装好打印机驱动,修改打印机端口,新建一个打印机端口,类型为本地端口,端口名称设置为C:\printer.log,再用标签设计软件打印一次,此文件中就有ZPL指令了。

==============================================================================================================

2012-06-02:发布代码ZebraPrintHelper.cs。

==============================================================================================================

2013-01-17:发布代码ZebraPrintHelper.cs,修正BUG,新增TCP打印支持Zebra无线打印QL320+系列打印机。已经生产环境实际应用,支持POS小票、吊牌、洗水唛、条码、文本混合标签打印。因涉及公司源码,只能截图VS解决方案给大家看。

==============================================================================================================

ZebraPrintHelper类代码:

[csharp]  

 

using System;  

using System.Collections.Generic;  

using System.Drawing;  

using System.Drawing.Imaging;  

using System.IO;  

using System.IO.Ports;  

using System.Net.Sockets;  

using System.Runtime.InteropServices;  

using System.Text;  

  

namespace Umisky.BarcodePrint.Core {  

    /// <summary>  

    /// 斑马打印助手,支持LPT/COM/USB/TCP四种模式,适用于标签、票据、条码打印。  

    /// </summary>  

    public static class ZebraPrintHelper {  

 

        #region 定义私有字段  

        /// <summary>  

        /// 线程锁,防止多线程调用。  

        /// </summary>  

        private static object SyncRoot = new object();  

        /// <summary>  

        /// ZPL压缩字典  

        /// </summary>  

        private static List<KeyValue> compressDictionary = new List<KeyValue>();  

        #endregion  

 

        #region 定义属性  

        public static float TcpLabelMaxHeightCM { get; set; }