using FATrace.App.UniCodeToZPL;
using System.Text;
using Zebra.Sdk.Comm;
using Zebra.Sdk.Printer;
namespace FATrace.App
{
///
/// 斑马打印
///
public class ZebraPrint
{
// 打印机连接参数
private readonly string _ip;
private readonly int _port;
private readonly int _readTimeoutMs = 10000;
///
/// 构造函数
///
/// 打印机 IP 地址
/// 打印机端口(通常为 9100)
public ZebraPrint(string ip, int port)
{
if (string.IsNullOrWhiteSpace(ip))
{
throw new ArgumentException("打印机 IP 不能为空", nameof(ip));
}
if (port <= 0 || port > 65535)
{
throw new ArgumentOutOfRangeException(nameof(port), "端口范围必须在 1-65535 之间");
}
_ip = ip;
_port = port;
}
// 使用按需连接模式,每次打印时建立并关闭连接。
///
/// 发送Zpl指令进行打印
///
/// ZPL 指令字符串
public void PrintZpl(string zplStr)
{
if (string.IsNullOrWhiteSpace(zplStr))
{
throw new ArgumentException("ZPL 指令不能为空", nameof(zplStr));
}
TcpConnection connection = null;
try
{
connection = new TcpConnection(_ip, TcpConnection.DEFAULT_ZPL_TCP_PORT);
connection.MaxTimeoutForRead = _readTimeoutMs;
connection.Open();
if (!connection.Connected)
{
throw new InvalidOperationException($"无法连接到打印机 {_ip}:{TcpConnection.DEFAULT_ZPL_TCP_PORT}");
}
ZebraPrinter printer = ZebraPrinterFactory.GetInstance(PrinterLanguage.ZPL, connection);
printer.SendCommand(zplStr);
}
catch (ConnectionException ex)
{
throw new InvalidOperationException($"与打印机 {_ip}:{_port} 通信失败:{ex.Message}", ex);
}
catch (Exception ex)
{
throw new InvalidOperationException($"发送 ZPL 指令到打印机失败:{ex.Message}", ex);
}
finally
{
try
{
connection?.Close();
}
catch
{
// 忽略关闭异常
}
}
}
///
/// 打印称重信息
///
public void PrintWeight(string Code, string RawName, double Weight, string Batch, int ShelfLife)
{
////二维码数据
//var Code = new StringBuilder();
//Code.Append(Batch);
//Code.Append(',');
//Code.Append(Weight.ToString().Replace(".", ""));
//Code.Append(',');
//Code.Append(ShelfLife.ToString());
//Code.Append(',');
//Code.Append(GetSourceInf(Source));
//Code.Append(',');
//Code.Append(DayCount.ToString());
var RawNameUnicodeZplStr = UnicodeToZPLHelper.CompressZPL(RawName, "RawName", new Font("宋体", 22f, FontStyle.Bold), TextDirection.Degree0);
var PrintZpl = new StringBuilder();
PrintZpl.AppendLine("~DGRawNameCN.GRF,1647,27,k0Y01K08K08M08R01g038J0EK0FL01CP0601CR0EL07CJ0FK0FL01FO01F01ER0OFJ0EK0EL03CO0HF83CR07R0EK0EL038N0HF803CR07I03N0E1J0EL078I0CI0HFCH038R07I07CK040E186H0EL07I01EH0101CH078R07I07L060E3E380EL0LF8I01CH07S07I06L070E381E0EL0EI01EJ01CH07I02O07I0CH02I038E3H0F0EK01CI03CJ01CH0EI07O070608H07I038E7H0F0EK038I078J01CH0KF8N0707KF8H03CE6H070EK07J078J01CH0EI0F8N0707J07I018E4H070EK07J0FK01CE1CI0EO0707J07I018ECH020EK0FCH01EK01DE18181CO0707J07K0E8J0EJ01CFH03CI03JFB81E18O0707J07K0E18I0EJ03078078K03C0301C3P0707J07K0E3CI0EJ0603C0FL03C0601C2P0707KFH01KFI0EJ0C03C1EL03C0601CQ0707J07J01EH06H0EI01801C3CL07C0C01CQ0707J07J03EH0380EI02H01878L07F0801CQ0707J07J03EH03C0EN0FM07D8061CQ0707J07J03FH01E0EM01EM0FDE079D8P0707J07J07FCH0F0EM07CM0FCF0F1HCP0607J07J07EFH0E0EM0FM01DC70F1C6P0607KFJ07E78060EL0DEI03I01DC70E1C7P060701C07J0HE3C060E3K0F8I038H039C31E1C38O0E0601C06J0CE1CI0E38I01LFCH039C31C1C38O0EI01CK01CE1CI0E7CI03EJ038H071C01C1C1CO0EI01CK018E08I0FCJ0FEJ038H061C0381C1EO0EH0C1CK030EI03FEJ03CEJ038H0E1C0301C0FO0EH0E1HCJ070EH07F0EJ0F0EJ038H0C1C0701C0FO0C01F1C78I060E3FCH0EI03C0EJ0380181C0601C078N0C03C1C1EI0C0E0CI0EI0EH0EJ0380301C0C01C078M01C0781C0F80180EK0EH03I0EJ0380201C1801C038M01C0F01C07E01H0EK0EL0EJ038I01C1801C038M0181C01C03F02H0EK0EL0EJ038I01C3H01C03N0383801CH0FJ0EK0EL0EJ038I01C6H01CP0307H01CH0FJ0EK0EL0EJ038I01CI01CP060C063CH07J0EK0EL0EJ038I01CH0E1CP061803FCH03J0EK0EL0LF8I01CH03FCP0C2I0F8M0EK0EL0EJ038I01CH01F8P08J078M0EK0EL0EJ03J01CI0FP01K02N0CK0EL0CO01J06g0K08K08z0z0h0");
PrintZpl.AppendLine("~DGWeightCN.GRF,407,11,h0P06L01S07FI0JF8O03HF8J0CH01R01K0JFR01H0CH0CH01P0KFEH0CH01R01K0JFR0102I0CH01P01JFM018N01810201LFC06L018102P0FL018102I0JF8H06L01IFEI0C0818O018102I0C0818O018103I0C0818O01JFI0JF8O018103I0C0818Q01K0JF8Q01018H0C081P07JFCJ08S01M080CH06N01J03JFEH0FN01H07J08J06K03LF8I08018U0LFCq0L0");
PrintZpl.AppendLine("~DGBatchCN.GRF,407,11,g0J01g0G01CO01P018608I07IF8O01870EI06H03P01860CI06H03P01B60CI06H03O03HFE0CI06H03P01860CI06H03P01860C3H07IFP018H6C7806H03P0187FC6O06L01BE0HCL03H0FL01E60FH0LF806L03860EJ0CQ01F860CJ0CQ039860CI018018N0H1860CI03IFCO01860CI01H018O01860CL038O01860C1K03P01861C1K03P018H6C1K03I06L0186HC1K03I0FL01878C1I0106I06K01F870E38I0FEP070207FJ03CP02O03p0M0");
PrintZpl.AppendLine("~DGShelfLifeCN.GRF,814,22,h0M04O018g0R07I08K0FEH0C1M08K0806R0E7HFC0107F8I0E18H08H01801IFC03R0C601801F8K0C18HFCH03H018018018Q0C601801807J0C18C0CH06H018018H08P018601801806I07IFC0CH04H018018H0CP01860180180606H0C18C0CH0CH018018H06P030601801KFH0C18C0CH08H018018H06P038601801806J0C18C0C018H01IF8H03P0707HF801806J0HF8HFC018H018018H03P07063180180608H0C18C0C03I018018H03I06L0DH03I019IFCH0C18C0C03I018018H03I0FL09H03I0198H08H0C18C0C03I018018H03I06K0H1H03030198408H0HF8C0C03I018018H03O0217JF8198708H0C18C0C03I018018H03P01H07I0198608H0C18HFC03I01IF8H03P01H0F4H0H18608H0C1HC0C03I018018H03P01H0F6H031860C07IFC0C018H03H018H03P0101B2H031860CK0C0C018H03H018H03P010I3H0318C0CH0620C0C018H03H018H06P010H3180218C08H073980CH0CH03H018H06P010631C0601F8I0E1D80CH04H06H018H0CI06L010C30E0401878H0C0DH0CH06H06H018H08I0FL0H18307H80701E0180BH0CH03H0CH018018I06L0130302080CH0E02H060F8H0181803F803Q01403H0103I0604H0C038I083I07806Q03H02J0CI02I01H01K04I02z0N0");
PrintZpl.AppendLine("^XA\r\n~TA000\r\n~JSN\r\n^LT0\r\n^MNW\r\n^MTT\r\n^PON\r\n^PMN\r\n^LH0,0\r\n^JMA\r\n^PR4,4\r\n~SD15\r\n^JUS\r\n^LRN\r\n^CI27\r\n^PA0,1,1,0\r\n^XZ\r\n^XA\r\n^MMT\r\n^PW472\r\n^LL354\r\n^LS0\r\n^FT275,366^BQN,2,7\r\n^FH\\^FDLA,");
PrintZpl.AppendLine(Code.ToString());
PrintZpl.AppendLine("^FS\r\n^FO150,10^XG");
PrintZpl.AppendLine("RawNameCN");
PrintZpl.AppendLine("^Fs");
PrintZpl.AppendLine("^FO110,65^GFA,");
PrintZpl.AppendLine(RawNameUnicodeZplStr);
PrintZpl.AppendLine("^FS\r\n^FO8,166^XG");
PrintZpl.AppendLine("WeightCN");
PrintZpl.AppendLine("^Fs\r\n^FT89,191^A0N,29,48^FH\\^CI28^FD");
PrintZpl.AppendLine(Weight.ToString() + "g");
PrintZpl.AppendLine("^FS^CI27\r\n^FO8,215^XG");
PrintZpl.AppendLine("BatchCN");
PrintZpl.AppendLine("^Fs\r\n^FT92,241^A0N,29,41^FH\\^CI28^FD");
PrintZpl.AppendLine(Batch);
PrintZpl.AppendLine("^FS^CI27\r\n^FO8,267^XG");
PrintZpl.AppendLine("ShelfLifeCN");
PrintZpl.AppendLine("^Fs\r\n^FO4,3^GB465,0,4^FS\r\n^FO2,3^GB0,349,4^FS\r\n^FO5,348^GB464,0,4^FS\r\n^FO467,3^GB0,349,4^FS\r\n^FT25,125^A0N,28,30^FH\\^CI28^FD");
PrintZpl.AppendLine(Code.ToString());
PrintZpl.AppendLine("^FS^CI27\r\n^FT175,293^A0N,28,48^FH\\^CI28^FD");
PrintZpl.AppendLine(ShelfLife.ToString());
PrintZpl.AppendLine("^FS^CI27\r\n^PQ1,0,1,Y\r\n^XZ");
//var dd= PrintZpl.ToString();
this.PrintZpl(PrintZpl.ToString());
}
}
}