C# ZPL命令 实现打印中文

最近用C#结合ZPL指令实现了打印中文的功能,在这里对其中的代码以及一些资源,分享一下.

一.直接使用ZPL打印

对于直接使用ZPL命令打印中文,首先需要明确几个概念:

1.码表文件: 字符编码文件,打印中文需要制定的码表,常用中文码表为 GB.DAT,GB8BIT.DAT,GB2312.DAT,GB18030.DAT, 其中 GB.DAT,GB8BIT.DAT为较早的机型使用编码表文件,码表可以自行下载,使用ANSI编码时必须配置编码表.

命令:^SE,例子:^SEE:GB18030.DAT^FS,其中E:为默认存储位置,大多数机器都默认存储在E盘,

存储盘符包括:

R: DRAM
B: PCMCIA Card
E: Flash Memory

2.字库文件: 我们常说的字体,打印中文需要中文字库文件,字库文件后缀为FNT或TTF,字库文件需要相应工具来转换。机器默认的字库文件可以到打印机官网查询,字库文件也可以自行下载,需要注意的是,由于字库文件需要一定的存储空间,最好选择合适的字库文件.

命令:^CW/^A,例子:^CW1,E:SIMSUN.FNT^A1,20,20^FS,其中^CW为定义字体,^A为调用SIMSUN.FNT为字体名称,1为定义的字体标识名称.

3.字符集,打印中文需要选取中文字符集,常用的有

14 = 双字节亚洲编码 a

26 = 包含 ASCII Transparency a 和 c 的多字节亚洲编码

28 = Unicode (UTF-8 编码) - Unicode 字符集

很多文章里提到了^CI17,官方文档上标注^CI17 命令已弃用,同时弃用的还有 ^CI17 命令正常工作所需的 ^F8 和 ^F16 命令。建议您改用 ^CI28-30 命令。我的建议是找跟自己打印机固件匹配的指令,打印机的固件版本可以到官网上获取.

官网:https://www.zebra.com/us/en/support-downloads/printers/industrial/zm400.html

命令:^CI,例子:^CI28

友情提示:

Encoding编码为ANSI时,需要码表文件和字库文件,而Unicode编码时,只需要字库文件即可.

可以使用 ^WD*:*.*命令进行查询打印机的码表,^WD为打印目录标签命令,你也可以使用^WDE:*.DAT,直接查询E:盘下后缀为DAT的有哪些.

代码例子:

1.使用 ANSI Encoding编码模式输出时,需要中文码表支持,ZPL命令如下:

^XA
^SEE:GB18030.DAT^FS
^CWJ,E:MSUNG.FNT^FS
^FO10,10^AJ,24,24^CI26^FD中文打印测试ANSI码^FS
^PQ1
^XZ

2.Encoding编码为UTF-8时,只要字库文件,此时改变国际字符集指令使用^CI17加^F8,或^CI28,如:

^XA
^CWJ,E:MSUNG.FNT^FS
^FO10,10^AJN,24,24^CI17^F8^FD中文打印测试UTF码^FS
^PQ1
^XZ
或:
^XA
^CWJ,E:MSUNG.FNT^FS
^FO10,10^AJN,24,24^CI28^FD中文打印测试UTF码^FS
^PQ1
^XZ

要注意编码表,字库文件和字符集三者都正确才能打印出中文,负责可能出现乱码的情况.

二.使用第三方库文件Fnthex32.dll转换为图像后打印,Fnthex32.dll 并没有找到官网下载地址,各位看官网上自己搜吧...该库文件分为8参和9参两个版本,此处以9参为例进行介绍,直接上代码

 public class ZebraPrintHelper
    {
        [DllImport("Fnthex32.dll")]
        public static extern int GETFONTHEX(
        string BarcodeText,//转换的文本
        string FontName,//打印字体
        string FileName,//存储的变量名称
        int Orient,//方向
        int Height,//字体高度,点阵高度
        int Width,//点阵宽度
        int IsBold,//是否加粗0,1
        int IsItalic,//是否斜体0,1
        StringBuilder ReturnBarcodeCMD);//存储的内容

        /// 
        /// 转换中文
        /// 
        /// 转换的字符
        /// 存储的变量名称
        /// 使用的字体
        /// 
        public static string ConvertChineseToHex(string chStr, string tempName, string font = "Microsoft YaHei")
        {
            StringBuilder cBuf = new StringBuilder(chStr.Length * 1024);
            int nCount = GETFONTHEX(chStr, font, tempName, 0, 25, 15, 1, 0, cBuf);
            string temp = " " + cBuf.ToString();
            temp = temp.Substring(0, nCount);
            return temp;
        }
    }

调用类库方法ConvertChineseToHex获取ZPL指令

string zplCode=ZebraPrintHelper.ConvertChineseToHex("打印测试ASD", "tempName", "Microsoft YaHei")

指令获取结果:

 ~DGtempName,00200,008,j03FC1FE0HF07F8I07FE3HF1HF8HFCI041F20F907C83EK0FH07803C01
EK0FH07803C01EJ03E01FH0F807CJ07C03E01FH0F8J0FH07803C01EJ01EH0FH07803CJ01EH0FH078
03CJ01EH0FH07803Cg01FH0F807C03EJ01FH0F807C03Ek0

这里~DG指令只是创建了一个名称为tempName的图像,我们还需要附加一条指令来调用它,如下

^FO15,5^XGtempName,1,1^FS

完整的ZPL命令应该是:

^XA
 ~DGtempName,00200,008,j03FC1FE0HF07F8I07FE3HF1HF8HFCI041F20F907C83EK0FH07803C01
EK0FH07803C01EJ03E01FH0F807CJ07C03E01FH0F8J0FH07803C01EJ01EH0FH07803CJ01EH0FH078
03CJ01EH0FH07803Cg01FH0F807C03EJ01FH0F807C03Ek0
^FO15,5^XGtempName,1,1^FS
^PQ1
^XZ

最后将ZPL命令以RAW模式发送至给印机即可.

最后在这里分享几个不错的网站:

1.在线调试网址,对于ZPL指令执行的结果可以进行调试.

http://labelary.com/viewer.html

2.资料网站,前查资料的时候发现的网站,有很多ZPL中文打印相关的问题和解答

http://www.winfuture.net/bbs/index.asp

你可能感兴趣的:(学习心得)