using Estsh.Client.Base;
using System.Data;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Text;
namespace Estsh.Client.ZPLPrinter
{
///
/// 中文字符串类
///
public class CNStr
{
public string Id;
public string Text;
public int XPos;
public int YPos;
public int Height;
}
///
/// 使用 ZPL 指令直接打印条码
///
public class PrintSNByZPL : StepBase
{
///
/// 打印条码
///
/// 数据源
/// ZPL模板名称
/// 打印机IP地址
/// 打印机端口号
/// 打印份数
/// 是否打印成功
public bool PrintSerialNumber(List snData, string templateFile, string printerIP, int printerPort, int copies)
{
if (snData == null || snData.Count == 0)
{
ShowMessage(this, "未包含打印数据!");
return false;
}
if (!File.Exists(templateFile))
{
ShowMessage(this, "文件不存在!" + templateFile);
return false;
}
// 此处最好加上 Ping 打印机的指令
// 存放处理好的打印指令,统一输出到打印机
List PrintPool = new List();
// 单个条码的打印指令
StringBuilder ZPLString = new StringBuilder(10 * 1024);
// 单个条码中的所有中文字符串
List CNStrs = new List();
// 处理 ZPL 模板文件
using (StreamReader sr = new StreamReader(templateFile))
{
while (!sr.EndOfStream)
{
string NewLine = sr.ReadLine();
// 有中文字符优先处理
if (NewLine.Contains("", "").Split(':');
ArrayStr = ArrayStr[1].Split(',');
cnStr.Id = ArrayStr[0];
cnStr.XPos = Convert.ToInt32(ArrayStr[1]);
cnStr.YPos = Convert.ToInt32(ArrayStr[2]);
cnStr.Height = Convert.ToInt32(ArrayStr[3]);
CNStrs.Add(cnStr);
}
else
{
ZPLString.Append(NewLine);
ZPLString.Append(Environment.NewLine);
}
}
}
// 遍历数据行
foreach (var dr in snData)
{
// 每个标签的打印指令
StringBuilder NewPrintZPLString = new StringBuilder(ZPLString.ToString());
// 遍历每一列
foreach (var dc in dr.GetType().GetProperties())
{
// 替换非中文字符变量, 格式表示
NewPrintZPLString.Replace(string.Format("<{0}>", dc.Name.Trim()), dr[dc.Name].ToString());
}
// 处理所有的中文字符串
foreach (CNStr cnStr in CNStrs)
{
if (dr.GetType().GetProperties().Contains(cnStr.Id))
{
// 如果数据源中存在这个字段,则替换具体的变量值
cnStr.Text = dr[cnStr.Id].ToString();
}
else
{
// 数据源中不存在这个字段就清空,防止残留变量值
cnStr.Text = string.Empty;
}
}
NewPrintZPLString.Append(GetZPLStringByCNStrs(CNStrs));
// 按照打印份数加入打印队列
for(int i=0; i < copies; i++)
{
PrintPool.Add(NewPrintZPLString.ToString());
}
}
// 输出到打印机
return PrintZPL(printerIP, printerPort, PrintPool);
}
///
/// 把处理好的 ZPL 指令队列输出到打印机
///
/// 打印机 IP 地址
/// 打印机端口号
/// ZPL指令队列
public bool PrintZPL(string printerIP, int printerPort, List zpls)
{
try
{
using (StreamWriter sw = new StreamWriter("log_" + DateTime.Now.ToString("yyyyMMdd") + ".txt", true))
{
sw.WriteLine(string.Format("{0}", 1));
sw.Flush();
sw.Close();
}
using (TcpClient client = new TcpClient())
{
client.Connect(printerIP, printerPort);
using (StreamWriter writer = new StreamWriter(client.GetStream()))
{
foreach (string zpl in zpls)
{
writer.Write(zpl);
using (StreamWriter sw = new StreamWriter("log_" + DateTime.Now.ToString("yyyyMMdd") + ".txt", true))
{
sw.WriteLine(string.Format("{0}", zpl));
sw.Flush();
sw.Close();
}
writer.Flush();
// 等待传输完成
Thread.Sleep(10);
}
writer.Close();
}
client.Close();
}
return true;
}
catch
{
using (StreamWriter sw = new StreamWriter("log_" + DateTime.Now.ToString("yyyyMMdd") + ".txt", true))
{
sw.WriteLine(string.Format("{0}", 2));
sw.Flush();
sw.Close();
}
return false;
}
}
// 获取字符串的点阵信息,用于 ZPL 中文打印
[DllImport(@"FNTHEX32.DLL", CharSet = CharSet.Ansi)]
public static extern int GETFONTHEX(
string chnstr,
string fontname,
string chnname,
int orient,
int height,
int width,
int bold,
int italic,
StringBuilder param1);
///
/// 中文文本转化成点阵字符串
///
/// 中文文本
/// 文本的ID,不能重复
/// 文本的高度
/// 点阵字符串
public string TextToHex(string text, string textId, int height)
{
StringBuilder hexBuilder = new StringBuilder(8 * 2048);
int subStrCount = 0;
subStrCount = GETFONTHEX(text, "Arial", textId, 0, height, 0, 1, 0, hexBuilder);
return hexBuilder.ToString().Substring(0, subStrCount);
}
///
/// 根据一组中文字符串信息获取对应的 ZPL 打印指令
///
/// 中文变量集合
private string GetZPLStringByCNStrs(List cnStrs)
{
string labelIdCmd = string.Empty;
string labelContentCmd = string.Empty;
int count = 0;
foreach (CNStr str in cnStrs)
{
if (!string.IsNullOrEmpty(str.Text))
{
labelIdCmd += "^FT" + str.XPos.ToString() + "," + str.YPos.ToString() + "^XG" + str.Id + ",1,1^FS";
labelContentCmd += TextToHex(str.Text, str.Id, str.Height);
count++;
}
}
string content = string.Empty;
if (count > 0)
{
content = labelContentCmd
+ "^LH0,0^PR2,2^FO0,0"
+ labelIdCmd;
}
content += "^PQ1,0,1,Y^XZ";
return content;
}
}
}