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