ZebraPrinter.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. using System;
  2. using System.Collections.Generic;
  3. //using System.Linq;
  4. using System.Text;
  5. using System.Net;
  6. using System.Net.Sockets;
  7. using System.IO;
  8. //using System.Windows.Forms;
  9. namespace PrintSolution.LabelPrinter
  10. {
  11. public class ZebraPrinter : ZPL2Command
  12. {
  13. /******************* 标签位置 ***********************/
  14. int blankOffset = 5; //边界宽带 单位:mm
  15. int labBoxLen1 = 26; //左边标签盒长度 单位:mm
  16. int labBoxLen2 = 29; //右边标签盒长度 单位:mm
  17. int fillBoxLen1 = 58; //左边填充盒长度 单位:mm
  18. int fillBoxLen2 = 60; //右边填充盒长度 单位:mm
  19. int rowHeight = 11; //行高 单位:mm
  20. int labHeadLen = 173; //标签头长度 单位:mm
  21. int labHeadWith = 29; //标签头宽带 单位:mm
  22. int offsetY = 0; //X坐标偏移量 单位:mm
  23. int offsetX = 0; //Y坐标偏移量 单位:mm
  24. int version = 2; //标签版本 1: 横向版本, 2: 纵向版本,3: 纵向版本(数据横着排),4: 横向版本,数据只有钢卷号、重量、生产日期
  25. /******************* 可变参数 ***********************/
  26. string strCmd = ""; // 指令
  27. int xPos = 0; // X坐标
  28. int yPos = 0; // Y坐标
  29. int rowNum = 0; // 字段行数
  30. /******************* 可变参数 ***********************/
  31. /// <summary>
  32. /// 构造函数
  33. /// </summary>
  34. public ZebraPrinter() : base()
  35. {
  36. initLabelSetting();
  37. }
  38. /// <summary>
  39. /// 构造函数
  40. /// </summary>
  41. public ZebraPrinter(string ipAddr) : base(ipAddr)
  42. {
  43. Addr = ipAddr;
  44. initLabelSetting();
  45. }
  46. /// <summary>
  47. /// 标签版本属性
  48. /// </summary>
  49. public int LableVersion
  50. {
  51. get
  52. {
  53. return version;
  54. }
  55. set
  56. {
  57. version = value;
  58. }
  59. }
  60. /// <summary>
  61. /// 变量初始化
  62. /// </summary>
  63. public void initLabelSetting()
  64. {
  65. blankOffset = 5; //mm
  66. labBoxLen1 = 26; //mm
  67. labBoxLen2 = 29; //mm
  68. fillBoxLen1 = 58; //
  69. fillBoxLen2 = 60; //
  70. rowHeight = 11;
  71. labHeadLen = 173;
  72. labHeadWith = 29;
  73. offsetY = 0;
  74. offsetX = 0;
  75. // 指令初始化
  76. strCmd = ""; // 指令
  77. xPos = 0; // X坐标
  78. yPos = 0; // Y坐标
  79. rowNum = 0; // 字段行数
  80. //
  81. FontDirect = 'B';
  82. // 设定坐标偏移量
  83. switch (version)
  84. {
  85. case 1:
  86. offsetX = 5;
  87. offsetY = 3;
  88. break;
  89. case 2:
  90. offsetX = 0;
  91. offsetY = -2;
  92. break;
  93. case 3:
  94. offsetX = 5;
  95. offsetY = 0;
  96. break;
  97. default:
  98. offsetX = 0;
  99. offsetY = -1;
  100. break;
  101. }
  102. }
  103. /// <summary>
  104. /// 打印标签的一行数据
  105. /// </summary>
  106. /// <param name="leftData">左边格子中的数据</param>
  107. /// <param name="rightData">右边格子中的数据</param>
  108. private void printLine(string leftData, string rightData)
  109. {
  110. switch (version)
  111. {
  112. case 1:
  113. // 打印左边的数据
  114. xPos = (blankOffset + labBoxLen1 + offsetX) * getDotMM();
  115. yPos = (blankOffset + labHeadWith + offsetY) * getDotMM() + rowNum * rowHeight * getDotMM();
  116. strCmd += fillDataCmd(xPos, yPos, leftData);
  117. // 打印右边的数据, Y 坐标不变
  118. xPos = (blankOffset + labBoxLen1 + fillBoxLen1 + labBoxLen2 + offsetX) * getDotMM();
  119. strCmd += fillDataCmd(xPos, yPos, rightData);
  120. break;
  121. case 2:
  122. xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetX) * getDotMM() + fontHeight;
  123. yPos = (blankOffset + offsetY) * getDotMM() + fillBoxLen2 * getDotMM() - getStringDots(rightData); //fillBoxLen2
  124. strCmd += getFontCmd() + fillDataCmd(xPos, yPos, rightData);
  125. // X 坐标不变
  126. //xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetX) * dotsMm +fontHeight ;
  127. yPos = (blankOffset + fillBoxLen2 + labBoxLen2 + offsetY) * getDotMM() + fillBoxLen1 * getDotMM() - getStringDots(leftData);//
  128. strCmd += getFontCmd() + fillDataCmd(xPos, yPos, leftData);
  129. break;
  130. case 3:
  131. /** 有标题的
  132. // 打印左边的数据
  133. strCmd += "^CFF,50,19\r\n"; //'^CFA,50,24';
  134. xPos = (blankOffset + 2 + offsetX) * getDotMM();
  135. yPos = (blankOffset + offsetY) * getDotMM() + rowNum * rowHeight * getDotMM();
  136. strCmd += fillDataCmd(xPos, yPos, leftData);
  137. // 打印右边的数据, Y 坐标不变
  138. strCmd += "^CFF,50,20\r\n"; //'^CFA,50,24';
  139. xPos = (blankOffset + labBoxLen1 + 3) * getDotMM();
  140. strCmd += fillDataCmd(xPos, yPos, rightData);
  141. **/
  142. //只打印数据
  143. strCmd += "^AFF,67,40\r\n"; //'^CFA,50,24';
  144. xPos = (blankOffset + 2 + offsetX) * getDotMM();
  145. yPos = (blankOffset + offsetY) * getDotMM() + rowNum * rowHeight * getDotMM();
  146. strCmd += fillDataCmd(xPos, yPos, rightData);
  147. break;
  148. }
  149. rowNum++;
  150. }
  151. /// <summary>
  152. /// 打印条码
  153. /// </summary>
  154. /// <param name="data">条码数据项</param>
  155. private void printBarcode(string data)
  156. {
  157. //int codeHeight = 150;
  158. int offset = 5;
  159. string orientation = "B"; // N = 正常 (Normal);R = 顺时针旋转90度(Roated);I = 顺时针旋转180度(Inverted);B = 顺时针旋转270度 (Bottom)
  160. switch (version)
  161. {
  162. case 1:
  163. xPos = (offset + blankOffset )* getDotMM();
  164. yPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetY) * getDotMM();
  165. orientation = "N";
  166. strCmd += getBarcodeCmd(xPos, yPos, orientation, data);
  167. break;
  168. case 2:
  169. xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offset) * getDotMM();//+ barcodeHeight
  170. yPos = labHeadLen * getDotMM() - data.Length * fontWidth; //(rowY + offsetY) * dotsMm + rowNum * rowHeight * dotsMm;
  171. orientation = "B";
  172. strCmd += getBarcodeCmd(xPos, yPos, orientation, data);
  173. break;
  174. case 3:
  175. offset = 52;
  176. xPos = (offset + blankOffset) * getDotMM();
  177. yPos = (blankOffset + 30 + rowNum * rowHeight + offsetY) * getDotMM();
  178. orientation = "N";
  179. strCmd += getBarcodeCmd(xPos, yPos, orientation, data);
  180. break;
  181. }
  182. }
  183. /// <summary>
  184. /// 打印标签
  185. /// </summary>
  186. /// <param name="coilLabel">标签内容</param>
  187. public void printLable(ColdCoilLable coilLabel)
  188. {
  189. initLabelSetting();
  190. strCmd += getBeginCmd();
  191. if(1 == version)strCmd += getDefaultFontCmd();
  192. if (3 == version) //添加标签打印模板3 纸张竖着、数据横排
  193. {
  194. blankOffset = 1;//为左边数据与边的间距;
  195. labBoxLen1 = 24;
  196. rowHeight = 10;
  197. //offsetY = 5;
  198. ////offsetX = 0;
  199. //strCmd += "^CFF,50,20\r\n"; //'^CFA,50,24';
  200. //// 打印标签头名称
  201. //xPos = (blankOffset + 2 + offsetX) * getDotMM();
  202. //yPos = (blankOffset + 2 + offsetY) * getDotMM() + rowNum * 5 * getDotMM();
  203. //strCmd += fillDataCmd(xPos, yPos, coilLabel.labelHeadName); //打印标签头,用labelHeadName来设置标签头名称,如:新钢冷轧厂冷硬卷标签
  204. //rowNum++;
  205. offsetY = 10;
  206. printLine("COIL NO.:", coilLabel.coilNo);
  207. printLine("SPECIFICATION:", coilLabel.specification);
  208. printLine("GRADE:", coilLabel.steelGrade);
  209. printLine("HEAT NO.:", coilLabel.heatNo);
  210. printLine("DIMENSION(mm):", coilLabel.dimension);
  211. printLine("WEIGHT(kg):", coilLabel.weight);
  212. printLine("DATE:", coilLabel.prodDate);
  213. //if (null != coilLabel.checker && "" != coilLabel.checker)
  214. // printLine("CHECKER:", coilLabel.checker);
  215. printLine("REMARKS:", "");
  216. //printBarcode(coilLabel.barcode); //取消条形码
  217. strCmd += getEndCmd();
  218. //writeDoc(strCmd);
  219. //sendMessage(Encoding.Default.GetBytes(strCmd));
  220. sendCommand(strCmd);
  221. }
  222. else if (4 == version) //添加标签打印模板4 纸张竖着、数据竖着(成品包装作业管理)
  223. {
  224. //offsetX = 15;
  225. //strCmd += "^A0N,80,60\r\n"; //'^CFA,50,24';字体设置:第一个字母A表示粗体,第3个字母R表示字体纵向,F表示横向;
  226. //// 打印标签钢卷号
  227. //xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetX) * getDotMM() + fontHeight;
  228. //yPos = (blankOffset + offsetY) * getDotMM() + 15;
  229. //strCmd += fillDataCmd(xPos, yPos, coilLabel.coilNo); //钢卷号
  230. //rowNum++;
  231. //offsetX = 0;
  232. //strCmd += "^A0B,75,60\r\n"; //'^CFA,50,24';
  233. //xPos = (blankOffset + 23 + offsetX) * getDotMM() + fontHeight;
  234. //yPos = (blankOffset + offsetY) * getDotMM() + 15; //fillBoxLen2
  235. //strCmd += fillDataCmd(xPos, yPos, coilLabel.weight + "kg");
  236. //// X 坐标不变
  237. //strCmd += "^A0R,75,59\r\n"; //'^CFF,50,20';
  238. ////xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetX) * dotsMm +fontHeight ; fillBoxLen1 * getDotMM()
  239. //yPos = (blankOffset + 5 + offsetY) * getDotMM() + fillBoxLen1 * getDotMM() - getStringDots(coilLabel.weight);//
  240. //strCmd += fillDataCmd(xPos, yPos, coilLabel.prodDate);
  241. //strCmd += getEndCmd();
  242. ////writeDoc(strCmd);
  243. ////sendMessage(Encoding.Default.GetBytes(strCmd));
  244. //sendCommand(strCmd);
  245. offsetX = 5;
  246. strCmd += "^A0R,100,100\r\n"; //'^CFA,50,24';字体设置:第一个字母A表示粗体,第3个字母R表示字体纵向,F表示横向;
  247. // 打印标签钢卷号
  248. //xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetX) * getDotMM() + fontHeight;
  249. //yPos = (blankOffset + offsetY) * getDotMM() + 15;
  250. //strCmd += fillDataCmd(xPos, yPos, coilLabel.coilNo); //钢卷号
  251. xPos = (blankOffset +labHeadWith*2+ rowNum * rowHeight + offsetX) * getDotMM() + fontHeight;
  252. yPos = (blankOffset + offsetY) * getDotMM() + 35;
  253. strCmd += fillDataCmd(xPos, yPos, coilLabel.coilNo); //钢卷号
  254. rowNum++;
  255. offsetX = 0;
  256. strCmd += "^A0R,75,60\r\n"; //'^CFA,50,24';
  257. xPos = (blankOffset + 23 + labHeadWith + offsetX) * getDotMM() + fontHeight;
  258. yPos = (blankOffset + offsetY) * getDotMM() + 35; //fillBoxLen2
  259. strCmd += fillDataCmd(xPos, yPos, coilLabel.weight + "kg");
  260. // X 坐标不变
  261. strCmd += "^A0R,75,59\r\n"; //'^CFF,50,20';
  262. //xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetX) * dotsMm +fontHeight ; fillBoxLen1 * getDotMM()
  263. yPos = (blankOffset + 5 + offsetY) * getDotMM() + fillBoxLen1 * getDotMM() - getStringDots(coilLabel.weight);//
  264. strCmd += fillDataCmd(xPos, yPos, coilLabel.prodDate.Substring(0,8));
  265. strCmd += getEndCmd();
  266. //writeDoc(strCmd);
  267. //sendMessage(Encoding.Default.GetBytes(strCmd));
  268. sendCommand(strCmd);
  269. }
  270. else if (5 == version) //添加标签打印模板4 纸张竖着、数据竖着(成品包装作业管理)
  271. {
  272. offsetX = 15;
  273. strCmd += "^A0B,80,60\r\n"; //'^CFA,50,24';字体设置:第一个字母A表示粗体,第3个字母R表示字体纵向,F表示横向;
  274. // 打印标签钢卷号
  275. xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetX) * getDotMM() ;
  276. yPos = (blankOffset + offsetY+labBoxLen1) * getDotMM() + 15;
  277. strCmd += fillDataCmd(xPos, yPos, coilLabel.coilNo); //钢卷号
  278. strCmd += "^A0B,75,60\r\n"; //'^CFA,50,24';
  279. yPos = (blankOffset + offsetY + fillBoxLen2 + labBoxLen1*2) * getDotMM() +15; //fillBoxLen2
  280. strCmd += fillDataCmd(xPos, yPos, coilLabel.specification);//标准号
  281. rowNum++;
  282. strCmd += "^A0B,80,60\r\n"; //'^CFA,50,24';字体设置:第一个字母A表示粗体,第3个字母R表示字体纵向,F表示横向;
  283. // 打印标签牌号炉号
  284. xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetX) * getDotMM();
  285. yPos = (blankOffset + offsetY + labBoxLen1) * getDotMM() + 15;
  286. strCmd += fillDataCmd(xPos, yPos, coilLabel.steelGrade); //牌号
  287. strCmd += "^A0B,75,60\r\n"; //'^CFA,50,24';
  288. yPos = (blankOffset + offsetY + fillBoxLen2 + labBoxLen1 * 2) * getDotMM() + 15; //fillBoxLen2
  289. strCmd += fillDataCmd(xPos, yPos, coilLabel.heatNo);//炉号
  290. String BarCode = "";
  291. BarCode += coilLabel.coilNo+" " ;
  292. BarCode += coilLabel.steelGrade + " ";
  293. BarCode += coilLabel.prodDate + " ";
  294. BarCode += coilLabel.weight;
  295. //BarCode = "^BQ,2,10^FDLA," + BarCode + "^FS";
  296. //strCmd += "^AFR,80,60\r\n"; //'^CFA,50,24';字体设置:第一个字母A表示粗体,第3个字母R表示字体纵向,F表示横向;
  297. // 打印标签钢卷号
  298. //xPos = (blankOffset + labHeadWith + rowNum * rowHeight + offsetX) * getDotMM() + fontHeight;
  299. //yPos = (blankOffset + offsetY) * getDotMM() + 120;
  300. //strCmd += fillDataCmd(xPos, yPos, BarCode);
  301. xPos = (blankOffset + labHeadWith/2) * getDotMM() + fontHeight;
  302. yPos = (blankOffset ) * getDotMM();
  303. strCmd += fillBQDataCmd(xPos, yPos, BarCode);
  304. //strCmd += "^FO100,100";
  305. //strCmd += "^BQ,2,10";
  306. //strCmd += "^FDLA," + BarCode + "^FS";
  307. strCmd += getEndCmd();
  308. sendCommand(strCmd);
  309. }
  310. else
  311. {
  312. printLine(coilLabel.rollNo, coilLabel.specification);
  313. printLine(coilLabel.coilNo, coilLabel.steelGrade);
  314. //printLine(coilLabel.heatNo, coilLabel.dimension);
  315. printLine(coilLabel.contractNo, coilLabel.weight);
  316. // printLine(coilLabel.prodDate, coilLabel.checker);
  317. printLine(coilLabel.licenseNo, coilLabel.licenseMark);
  318. printBarcode(coilLabel.barcode);
  319. strCmd += getEndCmd();
  320. sendCommand(strCmd);
  321. }
  322. }
  323. //测试写入数据到文本文件中
  324. public void writeDoc(string str)
  325. {
  326. string filePath = "d:\\infor.txt";//这里是你的已知文件,需先创建此文件
  327. FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite);
  328. StreamWriter sw = new StreamWriter(fs);
  329. fs.SetLength(0);//首先把文件清空了。
  330. sw.Write(str);//写你的字符串。
  331. sw.Close();
  332. }
  333. /// <summary>
  334. /// 测试函数
  335. /// </summary>
  336. public void test()
  337. {
  338. ColdCoilLable coilLabel = new ColdCoilLable();
  339. coilLabel.rollNo = "L1-017355-10";
  340. coilLabel.specification = "GB2009-2011XGSPC";
  341. coilLabel.steelGrade = "SPCC";
  342. coilLabel.dimension = "1.8*1205";
  343. coilLabel.coilNo = "L1-017355-10AA0";
  344. coilLabel.weight = "28050";
  345. coilLabel.heatNo = "J12-56790A";
  346. coilLabel.prodDate = DateTime.Now.ToString("yyyyMMddhhmmss");
  347. coilLabel.contractNo = "532011080001";
  348. coilLabel.licenseNo = "E532011";
  349. coilLabel.licenseMark = "XGHG";
  350. coilLabel.checker = "";
  351. coilLabel.barcode = coilLabel.coilNo;
  352. printLable(coilLabel);
  353. }
  354. }
  355. }