using System;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
//using System.Windows.Forms;
namespace PrintSolution.LabelPrinter
{
public class ZebraPrinter : ZPL2Command
{
/******************* 标签位置 ***********************/
int blankOffset = 5; //边界宽带 单位:mm
int labBoxLen1 = 26; //左边标签盒长度 单位:mm
int labBoxLen2 = 29; //右边标签盒长度 单位:mm
int fillBoxLen1 = 58; //左边填充盒长度 单位:mm
int fillBoxLen2 = 60; //右边填充盒长度 单位:mm
int rowHeight = 11; //行高 单位:mm
int labHeadLen = 173; //标签头长度 单位:mm
int labHeadWith = 29; //标签头宽带 单位:mm
int offsetY = 0; //X坐标偏移量 单位:mm
int offsetX = 0; //Y坐标偏移量 单位:mm
int version = 2; //标签版本 1: 横向版本, 2: 纵向版本,3: 纵向版本(数据横着排),4: 横向版本,数据只有钢卷号、重量、生产日期
/******************* 可变参数 ***********************/
string strCmd = ""; // 指令
int xPos = 0; // X坐标
int yPos = 0; // Y坐标
int rowNum = 0; // 字段行数
/******************* 可变参数 ***********************/
///
/// 构造函数
///
public ZebraPrinter() : base()
{
initLabelSetting();
}
///
/// 构造函数
///
public ZebraPrinter(string ipAddr) : base(ipAddr)
{
Addr = ipAddr;
initLabelSetting();
}
///
/// 标签版本属性
///
public int LableVersion
{
get
{
return version;
}
set
{
version = value;
}
}
///
/// 变量初始化
///
public void initLabelSetting()
{
blankOffset = 5; //mm
labBoxLen1 = 26; //mm
labBoxLen2 = 29; //mm
fillBoxLen1 = 58; //
fillBoxLen2 = 60; //
rowHeight = 11;
labHeadLen = 173;
labHeadWith = 29;
offsetY = 0;
offsetX = 0;
// 指令初始化
strCmd = ""; // 指令
xPos = 0; // X坐标
yPos = 0; // Y坐标
rowNum = 0; // 字段行数
//
FontDirect = 'B';
// 设定坐标偏移量
switch (version)
{
case 1:
offsetX = 5;
offsetY = 3;
break;
case 2:
offsetX = 0;
offsetY = -2;
break;
case 3:
offsetX = 5;
offsetY = 0;
break;
default:
offsetX = 0;
offsetY = -1;
break;
}
}
///
/// 打印标签的一行数据
///
/// 左边格子中的数据
/// 右边格子中的数据
private void printLine(string leftData, string rightData)
{
switch (version)
{
case 1:
// 打印左边的数据
xPos = (blankOffset + labBoxLen1 + offsetX) * getDotMM();
yPos = (blankOffset + labHeadWith + offsetY) * getDotMM() + rowNum * rowHeight * getDotMM();
strCmd += fillDataCmd(xPos, yPos, leftData);
// 打印右边的数据, Y 坐标不变
xPos = (blankOffset + labBoxLen1 + fillBoxLen1 + labBoxLen2 + offsetX) * getDotMM();
strCmd += fillDataCmd(xPos, yPos, rightData);
break;
case 2:
xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetX) * getDotMM() + fontHeight;
yPos = (blankOffset + offsetY) * getDotMM() + fillBoxLen2 * getDotMM() - getStringDots(rightData); //fillBoxLen2
strCmd += getFontCmd() + fillDataCmd(xPos, yPos, rightData);
// X 坐标不变
//xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetX) * dotsMm +fontHeight ;
yPos = (blankOffset + fillBoxLen2 + labBoxLen2 + offsetY) * getDotMM() + fillBoxLen1 * getDotMM() - getStringDots(leftData);//
strCmd += getFontCmd() + fillDataCmd(xPos, yPos, leftData);
break;
case 3:
/** 有标题的
// 打印左边的数据
strCmd += "^CFF,50,19\r\n"; //'^CFA,50,24';
xPos = (blankOffset + 2 + offsetX) * getDotMM();
yPos = (blankOffset + offsetY) * getDotMM() + rowNum * rowHeight * getDotMM();
strCmd += fillDataCmd(xPos, yPos, leftData);
// 打印右边的数据, Y 坐标不变
strCmd += "^CFF,50,20\r\n"; //'^CFA,50,24';
xPos = (blankOffset + labBoxLen1 + 3) * getDotMM();
strCmd += fillDataCmd(xPos, yPos, rightData);
**/
//只打印数据
strCmd += "^AFF,67,40\r\n"; //'^CFA,50,24';
xPos = (blankOffset + 2 + offsetX) * getDotMM();
yPos = (blankOffset + offsetY) * getDotMM() + rowNum * rowHeight * getDotMM();
strCmd += fillDataCmd(xPos, yPos, rightData);
break;
}
rowNum++;
}
///
/// 打印条码
///
/// 条码数据项
private void printBarcode(string data)
{
//int codeHeight = 150;
int offset = 5;
string orientation = "B"; // N = 正常 (Normal);R = 顺时针旋转90度(Roated);I = 顺时针旋转180度(Inverted);B = 顺时针旋转270度 (Bottom)
switch (version)
{
case 1:
xPos = (offset + blankOffset )* getDotMM();
yPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetY) * getDotMM();
orientation = "N";
strCmd += getBarcodeCmd(xPos, yPos, orientation, data);
break;
case 2:
xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offset) * getDotMM();//+ barcodeHeight
yPos = labHeadLen * getDotMM() - data.Length * fontWidth; //(rowY + offsetY) * dotsMm + rowNum * rowHeight * dotsMm;
orientation = "B";
strCmd += getBarcodeCmd(xPos, yPos, orientation, data);
break;
case 3:
offset = 52;
xPos = (offset + blankOffset) * getDotMM();
yPos = (blankOffset + 30 + rowNum * rowHeight + offsetY) * getDotMM();
orientation = "N";
strCmd += getBarcodeCmd(xPos, yPos, orientation, data);
break;
}
}
///
/// 打印标签
///
/// 标签内容
public void printLable(ColdCoilLable coilLabel)
{
initLabelSetting();
strCmd += getBeginCmd();
if(1 == version)strCmd += getDefaultFontCmd();
if (3 == version) //添加标签打印模板3 纸张竖着、数据横排
{
blankOffset = 1;//为左边数据与边的间距;
labBoxLen1 = 24;
rowHeight = 10;
//offsetY = 5;
////offsetX = 0;
//strCmd += "^CFF,50,20\r\n"; //'^CFA,50,24';
//// 打印标签头名称
//xPos = (blankOffset + 2 + offsetX) * getDotMM();
//yPos = (blankOffset + 2 + offsetY) * getDotMM() + rowNum * 5 * getDotMM();
//strCmd += fillDataCmd(xPos, yPos, coilLabel.labelHeadName); //打印标签头,用labelHeadName来设置标签头名称,如:新钢冷轧厂冷硬卷标签
//rowNum++;
offsetY = 10;
printLine("COIL NO.:", coilLabel.coilNo);
printLine("SPECIFICATION:", coilLabel.specification);
printLine("GRADE:", coilLabel.steelGrade);
printLine("HEAT NO.:", coilLabel.heatNo);
printLine("DIMENSION(mm):", coilLabel.dimension);
printLine("WEIGHT(kg):", coilLabel.weight);
printLine("DATE:", coilLabel.prodDate);
//if (null != coilLabel.checker && "" != coilLabel.checker)
// printLine("CHECKER:", coilLabel.checker);
printLine("REMARKS:", "");
//printBarcode(coilLabel.barcode); //取消条形码
strCmd += getEndCmd();
//writeDoc(strCmd);
//sendMessage(Encoding.Default.GetBytes(strCmd));
sendCommand(strCmd);
}
else if (4 == version) //添加标签打印模板4 纸张竖着、数据竖着(成品包装作业管理)
{
//offsetX = 15;
//strCmd += "^A0N,80,60\r\n"; //'^CFA,50,24';字体设置:第一个字母A表示粗体,第3个字母R表示字体纵向,F表示横向;
//// 打印标签钢卷号
//xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetX) * getDotMM() + fontHeight;
//yPos = (blankOffset + offsetY) * getDotMM() + 15;
//strCmd += fillDataCmd(xPos, yPos, coilLabel.coilNo); //钢卷号
//rowNum++;
//offsetX = 0;
//strCmd += "^A0B,75,60\r\n"; //'^CFA,50,24';
//xPos = (blankOffset + 23 + offsetX) * getDotMM() + fontHeight;
//yPos = (blankOffset + offsetY) * getDotMM() + 15; //fillBoxLen2
//strCmd += fillDataCmd(xPos, yPos, coilLabel.weight + "kg");
//// X 坐标不变
//strCmd += "^A0R,75,59\r\n"; //'^CFF,50,20';
////xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetX) * dotsMm +fontHeight ; fillBoxLen1 * getDotMM()
//yPos = (blankOffset + 5 + offsetY) * getDotMM() + fillBoxLen1 * getDotMM() - getStringDots(coilLabel.weight);//
//strCmd += fillDataCmd(xPos, yPos, coilLabel.prodDate);
//strCmd += getEndCmd();
////writeDoc(strCmd);
////sendMessage(Encoding.Default.GetBytes(strCmd));
//sendCommand(strCmd);
offsetX = 5;
strCmd += "^A0R,100,100\r\n"; //'^CFA,50,24';字体设置:第一个字母A表示粗体,第3个字母R表示字体纵向,F表示横向;
// 打印标签钢卷号
//xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetX) * getDotMM() + fontHeight;
//yPos = (blankOffset + offsetY) * getDotMM() + 15;
//strCmd += fillDataCmd(xPos, yPos, coilLabel.coilNo); //钢卷号
xPos = (blankOffset +labHeadWith*2+ rowNum * rowHeight + offsetX) * getDotMM() + fontHeight;
yPos = (blankOffset + offsetY) * getDotMM() + 35;
strCmd += fillDataCmd(xPos, yPos, coilLabel.coilNo); //钢卷号
rowNum++;
offsetX = 0;
strCmd += "^A0R,75,60\r\n"; //'^CFA,50,24';
xPos = (blankOffset + 23 + labHeadWith + offsetX) * getDotMM() + fontHeight;
yPos = (blankOffset + offsetY) * getDotMM() + 35; //fillBoxLen2
strCmd += fillDataCmd(xPos, yPos, coilLabel.weight + "kg");
// X 坐标不变
strCmd += "^A0R,75,59\r\n"; //'^CFF,50,20';
//xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetX) * dotsMm +fontHeight ; fillBoxLen1 * getDotMM()
yPos = (blankOffset + 5 + offsetY) * getDotMM() + fillBoxLen1 * getDotMM() - getStringDots(coilLabel.weight);//
strCmd += fillDataCmd(xPos, yPos, coilLabel.prodDate.Substring(0,8));
strCmd += getEndCmd();
//writeDoc(strCmd);
//sendMessage(Encoding.Default.GetBytes(strCmd));
sendCommand(strCmd);
}
else if (5 == version) //添加标签打印模板4 纸张竖着、数据竖着(成品包装作业管理)
{
offsetX = 15;
strCmd += "^A0B,80,60\r\n"; //'^CFA,50,24';字体设置:第一个字母A表示粗体,第3个字母R表示字体纵向,F表示横向;
// 打印标签钢卷号
xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetX) * getDotMM() ;
yPos = (blankOffset + offsetY+labBoxLen1) * getDotMM() + 15;
strCmd += fillDataCmd(xPos, yPos, coilLabel.coilNo); //钢卷号
strCmd += "^A0B,75,60\r\n"; //'^CFA,50,24';
yPos = (blankOffset + offsetY + fillBoxLen2 + labBoxLen1*2) * getDotMM() +15; //fillBoxLen2
strCmd += fillDataCmd(xPos, yPos, coilLabel.specification);//标准号
rowNum++;
strCmd += "^A0B,80,60\r\n"; //'^CFA,50,24';字体设置:第一个字母A表示粗体,第3个字母R表示字体纵向,F表示横向;
// 打印标签牌号炉号
xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetX) * getDotMM();
yPos = (blankOffset + offsetY + labBoxLen1) * getDotMM() + 15;
strCmd += fillDataCmd(xPos, yPos, coilLabel.steelGrade); //牌号
strCmd += "^A0B,75,60\r\n"; //'^CFA,50,24';
yPos = (blankOffset + offsetY + fillBoxLen2 + labBoxLen1 * 2) * getDotMM() + 15; //fillBoxLen2
strCmd += fillDataCmd(xPos, yPos, coilLabel.heatNo);//炉号
String BarCode = "";
BarCode += coilLabel.coilNo+" " ;
BarCode += coilLabel.steelGrade + " ";
BarCode += coilLabel.prodDate + " ";
BarCode += coilLabel.weight;
//BarCode = "^BQ,2,10^FDLA," + BarCode + "^FS";
//strCmd += "^AFR,80,60\r\n"; //'^CFA,50,24';字体设置:第一个字母A表示粗体,第3个字母R表示字体纵向,F表示横向;
// 打印标签钢卷号
//xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetX) * getDotMM() + fontHeight;
//yPos = (blankOffset + offsetY) * getDotMM() + 120;
//strCmd += fillDataCmd(xPos, yPos, BarCode);
xPos = (blankOffset + labHeadWith/2) * getDotMM() + fontHeight;
yPos = (blankOffset ) * getDotMM();
strCmd += fillBQDataCmd(xPos, yPos, BarCode);
//strCmd += "^FO100,100";
//strCmd += "^BQ,2,10";
//strCmd += "^FDLA," + BarCode + "^FS";
strCmd += getEndCmd();
sendCommand(strCmd);
}
else
{
printLine(coilLabel.rollNo, coilLabel.specification);
printLine(coilLabel.coilNo, coilLabel.steelGrade);
//printLine(coilLabel.heatNo, coilLabel.dimension);
printLine(coilLabel.contractNo, coilLabel.weight);
// printLine(coilLabel.prodDate, coilLabel.checker);
printLine(coilLabel.licenseNo, coilLabel.licenseMark);
printBarcode(coilLabel.barcode);
strCmd += getEndCmd();
sendCommand(strCmd);
}
}
//测试写入数据到文本文件中
public void writeDoc(string str)
{
string filePath = "d:\\infor.txt";//这里是你的已知文件,需先创建此文件
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite);
StreamWriter sw = new StreamWriter(fs);
fs.SetLength(0);//首先把文件清空了。
sw.Write(str);//写你的字符串。
sw.Close();
}
///
/// 测试函数
///
public void test()
{
ColdCoilLable coilLabel = new ColdCoilLable();
coilLabel.rollNo = "L1-017355-10";
coilLabel.specification = "GB2009-2011XGSPC";
coilLabel.steelGrade = "SPCC";
coilLabel.dimension = "1.8*1205";
coilLabel.coilNo = "L1-017355-10AA0";
coilLabel.weight = "28050";
coilLabel.heatNo = "J12-56790A";
coilLabel.prodDate = DateTime.Now.ToString("yyyyMMddhhmmss");
coilLabel.contractNo = "532011080001";
coilLabel.licenseNo = "E532011";
coilLabel.licenseMark = "XGHG";
coilLabel.checker = "";
coilLabel.barcode = coilLabel.coilNo;
printLable(coilLabel);
}
}
}