【C#】打印机ZPL指令,打印文本,中文,条码,图片
ZPL一些简单的指令
^XA 开始
^XZ 结束
^LL 设置标签长度(我用的打印机是TSC TE344,这好像没有效果)
^PW 设置标签宽度
^FS 换行
^FS 注释
^LH0,0 纸张的边距,左边距和上边距
^FO0,0 设置打印内容坐标
^FD123 设置打印内容,可以是文本,一维码,二维码
更多指令:请看这里
一段完整的ZPL指令
^XA
^XA^LH0,0^LL100^PW580^FX 文本
^FO10,10^AFN,0,20,10^FD123456^FS
^FX 一维码
^FO10,10^BY2,11.0,10,40^BCC,90,N^FD12345678^FS
^FX 二维码
^FO10,10^BQ,2,5^CI26^FH^FDQA^FD1215445244^FS^XZ
打印文本
^FO10,10^AFN,0,20,10^FD123456^FS
打印一维码
^FO10,10^BY2,11.0,10,40^BCC,80,N^FD12345678^FS
其中^BCC,80,N的80为一维码的高度,N表示不显示注释行,则显示内容12345678
打印二维码
^FO10,10^BQ,2,5^CI26^FH^FDQA^FD1215445244^FS
其中^BQ,2,5的5为二维码大小,范围1-10
关于中文打印
由于打印机没有中文的字库,打印中文会出现乱码
一种解决方法就是安装中文字符,码表,这个有点麻烦,就不用了
另一种就是,通过Fnthex32.dll,将文字转为打印机指令,再发送到打印机
Fnthex32.dll下载:
链接:https://pan.baidu.com/s/1_lU0zswvE929wpXG0431Wg
提取码:oi41
使用
[DllImport("Fnthex32.dll")]
private static extern int GETFONTHEX(
string text,//文本
string fontName,//字体
string tempName,//临时变量
int orient,//方向
int height,//字体高度
int width,//字体宽度
int isBold,//是否加粗0,1
int isItalic,//是否斜体0,1
StringBuilder cmd);//内容/// <summary>
/// 获取文本编码
/// </summary>
/// <param name="text">文本</param>
/// <param name="fontName">字体</param>
/// <param name="tempName">临时变量</param>
/// <param name="height">字体高度</param>
/// <param name="width">字体宽度</param>
/// <param name="isBlod">是否加粗</param>
/// <param name="isItalic">是否斜体</param>
/// <returns></returns>
public static string GetFontHex(string text, string fontName, string tempName,int height = 40, int width = 15, bool isBlod = false, bool isItalic = false)
{int nIsBlod = isBlod ? 1 : 0;int nIsItalic = isItalic ? 1 : 0;StringBuilder context = new StringBuilder(text.Length * 1024);int count = GETFONTHEX(text, fontName, tempName, 1, height, width, nIsBlod, nIsItalic, context);string temp = " " + context.ToString();temp = temp.Substring(0, count);return temp;
}
通过GetFontHex获取ZPL指令
string sTemp = GetFontHex("啊", "Arial", "temp0");
其中temp0是一个临时变量
接下来,再通过一条指令来设置
^FO30,0^XGtemp0,1,1^FS
完整指令
^XA
^LH0,0^LL80^PW580
~DGtemp0,00240,006,iH0108H0CL01FDHFEJ03F918018J031918018J03191H018J03191H018J031
93H018J03192H198J031921F98J03192H198J03194H198J03192H198J0319I198J0319I198J03191
9198J031909198J03190D198J03190DF98J03F90D198J031919H18J03H1F8018J03013H018L01I01
8L01I018L01I018L01I018L01I018L01H01F8L01I07M01I02iK0
^FO30,0^XGtemp0,1,1^FS
^XZ
关于图片的打印
打印图片,需要将图片转换成十六进制指令
https://blog.csdn.net/weixin_38211198/article/details/96494614
指令发送到打印机
首选需要设置打印机共享
才使用System.IO.File.Copy方法
//保存到本地文件
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(printFilePath))
{sw.Write(cmd.ToString());
}
//将ZPL指令发送到打印机
File.Copy(printFilePath, mPrintName, true);
其中
printFilePath为ZPL指令文件路径
mPrintName为打印机路径,例如:mPrintName = @"\\192.168.0.132\TSC TE344";
指令需要获取本机IP4地址
/// <summary>
/// 获取IP4地址
/// </summary>
private string GetIP4()
{string ip4 = string.Empty;IPHostEntry ipe = Dns.GetHostEntry(Dns.GetHostName());IPAddress[] ips = ipe.AddressList;for (int i = 0; i < ips.Length; i++){if (ips[i].AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork){ip4 = ips[i].ToString();break;}}return ip4;
}
其实本机IP直接写127.0.0.1就好
关于打印机初始化
由于之前使用佳博Gprinter GP-9134T打印机,不是使用ZPL指令,直接使用PrintDocument类打印控件的图片,打印机都是自动校准的,现在TSC TE344打印机,由于现在打印机没有校准功能,用PrintDocument打印总是会打印一半纸张,所以改为ZPL指令打印,为了能同时使用多种打印机,之后做兼容。
由于用PrintDocument打印,导致出纸不准确,可用下面这指令初始化打印机,这指令是从NiceLabel得到的
首先,要设置好打印纸张的大小,边距等,在打印到文件,即可获取该初始化指令(BarTender)
/// <summary>
/// 打印机初始化
/// </summary>
private void PrintInit()
{string printerInitCMD = @"<xpml><page quantity='0' pitch='15.1 mm'></xpml>SIZE 47.5 mm, 15.1 mmGAP 2 mm, 0 mmDIRECTION 0,0REFERENCE 0,0OFFSET 0 mmSET PEEL OFFSET CUTTER OFFSET PARTIAL_CUTTER OFF<xpml></page></xpml><xpml><page quantity='1' pitch='15.1 mm'></xpml>SET TEAR ONCLS<xpml></page></xpml><xpml><end/></xpml>";string PrinterInitFilePath = printPath + "\\PrinterInit.prn";using (StreamWriter sw = new StreamWriter(PrinterInitFilePath)){sw.Write(printerInitCMD);}File.Copy(PrinterInitFilePath, mPrintName, true);
}
使用的打印纸规格
双排打印纸
实际大小(mm)
标签宽高:22*15
卷宽:50
左右边距:2
行距:2
列距:2
代码中大小
标签宽高:235*160
纸张宽度:580
左右边距:30
中缝边距:50
总结:
由于ZPL刚学,不熟悉,项目中需要支持自定义打印模板功能,即用户自己调整,拖拽标签位置等,
考虑到
1.ZPL预览功能有点难度
2.ZPL指令的参数限制,比如条码的宽高无法与控件的大小兼容
所以直接通过打印控件上的图片,将图片转为十六进制指令发送到打印机,
这样还有一个好处就是不用考虑中文乱码的问题
下面是我的PrintManager
public class PrintManager
{#region 文字转图像[DllImport("Fnthex32.dll")]private static extern int GETFONTHEX(string text,//文本string fontName,//字体string tempName,//临时变量int orient,//方向int height,//字体高度int width,//字体宽度int isBold,//是否加粗0,1int isItalic,//是否斜体0,1StringBuilder cmd);//内容/// <summary>/// 获取文本编码/// </summary>/// <param name="text">文本</param>/// <param name="fontName">字体</param>/// <param name="tempName">临时变量</param>/// <param name="height">字体高度</param>/// <param name="width">字体宽度</param>/// <param name="isBlod">是否加粗</param>/// <param name="isItalic">是否斜体</param>/// <returns></returns>public static string GetFontHex(string text, string fontName, string tempName,int height = 40, int width = 15, bool isBlod = false, bool isItalic = false){int nIsBlod = isBlod ? 1 : 0;int nIsItalic = isItalic ? 1 : 0;StringBuilder context = new StringBuilder(text.Length * 1024);int count = GETFONTHEX(text, fontName, tempName, 1, height, width, nIsBlod, nIsItalic, context);string temp = " " + context.ToString();temp = temp.Substring(0, count);return temp;}#endregion//纸张宽度int paperWidth = 580;//左右边距int padding = 30;//中缝边距int middlePadding = 50;//标签宽度int labelWidth = 235;//标签高度int labelHeight = 160;string ip4;public StringBuilder cmd;//打印目录string printPath;//保存打印指令string printFilePath ;//打印机名称private string mPrintName;public PrintManager(){printPath = Application.StartupPath + "\\Print";if (Directory.Exists(printPath) == false){Directory.CreateDirectory(printPath);}printFilePath = printPath + "\\print.prn";ip4 = GetIP4();}public void Init(string printerName){mPrintName = string.Format(@"\\{0}\{1}", ip4, printerName);//mPrintName = @"\\192.168.0.132\TSC TE344";//打印机初始化PrintInit();cmd = new StringBuilder();cmd.AppendFormat(@"^XA^LH0,0^LL{0}^PW{1}", 80, paperWidth);}/// <summary>/// 获取IP4地址/// </summary>private string GetIP4(){string ip4 = string.Empty;IPHostEntry ipe = Dns.GetHostEntry(Dns.GetHostName());IPAddress[] ips = ipe.AddressList;for (int i = 0; i < ips.Length; i++){if (ips[i].AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork){ip4 = ips[i].ToString();break;}}return ip4;}/// <summary>/// 打印机初始化/// </summary>private void PrintInit(){string printerInitCMD = @"<xpml><page quantity='0' pitch='15.1 mm'></xpml>SIZE 47.5 mm, 15.1 mmGAP 2 mm, 0 mmDIRECTION 0,0REFERENCE 0,0OFFSET 0 mmSET PEEL OFFSET CUTTER OFFSET PARTIAL_CUTTER OFF<xpml></page></xpml><xpml><page quantity='1' pitch='15.1 mm'></xpml>SET TEAR ONCLS<xpml></page></xpml><xpml><end/></xpml>";string PrinterInitFilePath = printPath + "\\PrinterInit.prn";using (StreamWriter sw = new StreamWriter(PrinterInitFilePath)){sw.Write(printerInitCMD);}File.Copy(PrinterInitFilePath, mPrintName, true);}/// <summary>/// 打印/// </summary>public void Print(){cmd.Append("^XZ");//保存到本地文件using (System.IO.StreamWriter sw = new System.IO.StreamWriter(printFilePath)){sw.Write(cmd.ToString());}//将ZPL指令发送到打印机File.Copy(printFilePath, mPrintName, true);}/// <summary>/// 设置文本-中文乱码/// </summary>public void SetText(string value, Point loc){cmd.AppendFormat("^FO{0},{1}^AFN,0,20,10^FD{2}^FS", padding + loc.X, loc.Y, value);}int iTemp = 0;/// <summary>/// 设置文本-中文正常/// </summary>public void SetText_Chinese(string value, Point loc){string tempName = "temp" + iTemp;string sTemp = GetFontHex(value, "Arial", tempName);cmd.Append(sTemp);cmd.AppendFormat("^FO{0},{1}^XG{2},1,1^FS", padding + loc.X, loc.Y, tempName);iTemp++;}/// <summary>/// 设置二维码/// </summary>public void SetQR_Code(string value, Point loc, int size)//0到10{cmd.AppendFormat("^FO{0},{1}^BQ,2,{2}^CI26^FH^FDQA^FD{3}^FS", padding + loc.X, loc.Y, size, value);}/// <summary>/// 设置一维码/// </summary>public void SetCODE_128(string value, Point loc, Size size){cmd.AppendFormat(@"^FO{0},{1}^BY2,11.0,60,{2}^BCC,{3},N^FD{4}^FS", padding + loc.X, loc.Y, size.Width, size.Height, value);}int iTemp2 = 0;/// <summary>/// 设置图片/// </summary>public void SetImage(Image image, bool isRight = false){image = ReSizeImage(image, new Size(labelWidth + 20, labelHeight));string data = ZebraUnity.BitmapToHex(image, out int to, out int row);string zpl = string.Format("~DGR:Temp{0}.GRF,{1},{2},{3}", iTemp2, to, row, data);cmd.Append(zpl);int offset = isRight == true ? labelWidth + middlePadding : 0;cmd.AppendFormat("^FO{0},0^XGR:Temp{1}.GRF,1,1^FS", padding + offset, iTemp2);iTemp2++;}/// <summary>/// 改变图像大小/// </summary>public static Image ReSizeImage(Image img, Size size){Bitmap bitmap = new Bitmap(size.Width, size.Height);Graphics g = Graphics.FromImage(bitmap);g.InterpolationMode = InterpolationMode.HighQualityBicubic;g.DrawImage(img, 0, 0, bitmap.Width, bitmap.Height);g.Dispose();return bitmap;}}
其中ZebraUnity.BitmapToHex 看 https://blog.csdn.net/weixin_38211198/article/details/96494614
相关链接:
ZPL指令解析:
百度文库:https://wenku.baidu.com/view/ec78b8cbf01dc281e43af039.html
道客巴巴:http://www.doc88.com/p-2018927808824.html
ZPL指令预览:
http://labelary.com/viewer.html
【C#】打印机ZPL指令,打印文本,中文,条码,图片相关推荐
- ZPL指令打印 斑马打印机指令打印
首先ZPL(Zebra Programming language)是斑马家搞的ZPL语言,用于和打印机通讯打印开发的指令.然后理解了这个只是个指令的东西后,我们接着就想想怎么弄,本着怎么简单怎么来的原 ...
- [C#] ZEBRA ZPL指令打印BarCode,QRCode
公司业务需要 接触到c#的打印机方面的业务.要求客户端控制打印机来打印条码,二维码. 条码:在条码打印上 在传参方面和排版方面需要去慢慢调试. 二维码:直接指令打印二维码在控制二维码大小很难把控,因为 ...
- zpl指令打印中文内容_【初学指南】快速入门运维的高效指令~
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程序和网络协议.它支持32位 ...
- zpl指令打印中文内容_大疆机甲大师Python开发: 中文命名变量初尝试
简言之, 官方例程中的Twister程序, 略加修改添加了一个中文变量, 运行成功! def start()速度 = 120...chassis_ctrl.set_rotate_speed(速度)gi ...
- java调用zebra_java调用斑马GK888t打印机(ZPL指令)
在项目中使用斑马打印机遇到了如下问题: 在实际打印信息前,需要修改打印机驱动设置,主要是设置打印颜色深度,默认值一般会打印的比较浅.通常情况下,在设置的颜色深度后,打印机能够很好的工作.但是如果我将程 ...
- 指令打印与驱动打印随笔
本文对指令打印和驱动打印做了一个简要的介绍,分享了在开发客户端打印组件时的一些过程并提出了一个新轮子用于解决老的问题并引出更多的新问题.全文大概 3500 字无图,阅读大概需要 7 分钟. 驱动打印是 ...
- 单片机 驱动 标签打印机tsc_指令打印与驱动打印随笔
本文对指令打印和驱动打印做了一个简要的介绍,分享了在开发客户端打印组件时的一些过程并提出了一个新轮子用于解决老的问题并引出更多的新问题.全文大概 3500 字无图,阅读大概需要 7 分钟. 驱动打印是 ...
- 通过ZPL指令调用zebra打印机打印面单(java版)
1.获取打印机的IP及端口(端口默认为9100): 2.通过RabbitMQ发送监听调用打印方法: 3.查询数据库中打印机是否存在,并获取打印机IP及端口: 4.查询要打印的订单信息及明细: 5.打印 ...
- 发送ZPL指令到斑马打印机,并监控打印成功或者失败的状态信息
Visual C# 入门 本文共分为两个部分: 第一部分:介绍如何与Zebar进行连接,把ZPL指令或者模板文件发送到斑马打印机进行打印. 第二部分:介绍如何接收Zebar进行打印之后如何得到斑马打印 ...
- C#发送ZPL指令到打印机
生产类型的公司,为保证标签打印出来的清晰度和识别度,建议直接使用ZPL底层指令进行打印,或者使用一些打印软件,但是大部分打印软件都要收费(不建议破解),所以还是自己动手丰衣足食吧,下面提供个ZPL的打 ...
最新文章
- 2021年大数据ELK(六):安装Elasticsearch
- POJ.3207.Ikki's Story IV-Panda's Trick(2-SAT)
- mac搭建python开发环境_Mac中基于Homebrew搭建python开发环境
- 裴健当选加拿大皇家学会院士:曾任华为首席科学家、京东副总裁,学术引用超8万次...
- 002_CSS基础语法
- 如何给DPM服务器附加磁盘?
- 黑马程序员之《String 类练习》
- 删除vss文件批处理
- python从数分到数编(part2)--随机数及数组
- drupal显示图片_Drupal在多样性和包容性方面显示领导力
- 软件架构之道的一次感悟
- Atom飞行手册翻译: 1.3 Atom基础
- Atom飞行手册翻译: 2.2 在Atom中移动
- Operation not permitted - /usr/bin/xcodeproj
- 微信回应 WeTool 被封事件;支付宝小程序开放直播功能;Raspberry Pi 4 发布 8GB 版本| 极客头条...
- 计算机应用技术参加文献,面向科技文献的机器翻译(4)-计算机应用技术专业毕业论文.docx...
- 计算机网络可以划分几个阶段,计算机网络的发展可以划分为几个阶段.doc
- c语言匀加速直线运动求位移,匀加速直线运动规律.doc
- matlab产生正定矩阵
- isempty()函数用法
热门文章
- 在Google工作的十年,也是我开心的十年
- 无需格式化 移动硬盘/U盘上装WinPE、Win7PE图解
- 效果图什么网站赚零花钱_为什么你赚的钱少
- 淘宝差评回复模板,最新最全差评回复话术
- [Java,IDEA]连接oracle的关于oracle.jdbc.driver.OracleDriver一直驱动加载失败的原因
- IT规划的两大困惑及未来之路
- 八进制数转十进制计算机计算器,八进制转十进制计算器
- firefox主页被360篡改_IE浏览器主页被劫持,如何解决主页被篡改问题?
- 解决deep freeze冰点还原软件无法冻结的问题:计算机正在完成Deep Freeze冰点检测到的待定Windows更新
- 【算法:leetcode】双指针:142. 环形链表 II 633. 平方数之和