309 lines
9.6 KiB
C#
309 lines
9.6 KiB
C#
using System;
|
|
using System.ComponentModel;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace StdLabelPrint
|
|
{
|
|
public partial class LabelPrint
|
|
{
|
|
public string printerName { get; set; } = string.Empty;
|
|
public List<string> connectedPrinter = new List<string>();
|
|
public string LastPrintZPL = string.Empty;
|
|
public string qrData = string.Empty;
|
|
public string baseZPL { get; set; }
|
|
|
|
public LabelPrint(string _prtName)
|
|
{
|
|
//GetPrinterList();
|
|
|
|
//if (connectedPrinter.Contains(_prtName) == false)
|
|
// throw new Exception("연결된 프린터가 아닙니다.");
|
|
|
|
printerName = _prtName;
|
|
baseZPL = Properties.Settings.Default.zpl;
|
|
|
|
}
|
|
|
|
public List<string> GetPrinterList()
|
|
{
|
|
connectedPrinter = new List<string>();
|
|
var list_local = FindPrinters(PrinterEnumFlags.PRINTER_ENUM_LOCAL);
|
|
var list_connected = FindPrinters(PrinterEnumFlags.PRINTER_ENUM_CONNECTIONS);
|
|
try
|
|
{
|
|
connectedPrinter.AddRange(list_local);
|
|
}
|
|
catch { }
|
|
|
|
try
|
|
{
|
|
connectedPrinter.AddRange(list_connected);
|
|
}
|
|
catch { }
|
|
return connectedPrinter;
|
|
}
|
|
public string makeZPL_210101(Reel reel, Boolean D1RID, Boolean drawbox, out string qrData)
|
|
{
|
|
string prtData = string.Empty;
|
|
qrData = string.Format("{0};{1};{2};{3};{4};{5};{6}", reel.sid, reel.lot, reel.manu, reel.qty, reel.id, reel.mfg, reel.partnum);
|
|
prtData = "^XA\r\n";
|
|
prtData += "^MMT\r\n";
|
|
prtData += "^PW519\r\n";
|
|
prtData += "^LL0200\r\n";
|
|
prtData += "^LS0\r\n";
|
|
prtData += "^FO128,96^GFA,01536,01536,00048,:Z64:\r\n";
|
|
prtData += "eJxjYBgFo2AUkADs/xMN/g1G9aNgFMABAIF9rE0=:1194\r\n";
|
|
|
|
if (drawbox)
|
|
prtData += "^FO1,7^GB505,185,4^FS\r\n";
|
|
|
|
prtData += "^BY2,3,41^FT280,82^BCN,,N,N,N,A\r\n";
|
|
prtData += "^FD" + reel.sid + "^FS\r\n";
|
|
prtData += "^FT12,160^BQN,2,4\r\n";
|
|
prtData += string.Format("^FH\\^FDLA,{0}^FS\r\n", qrData);
|
|
prtData += "^BY2,3,32^FT86,185^BCN,,N,N,N,A\r\n";
|
|
prtData += string.Format("^FD{0};{1}^FS\r\n", reel.sid, reel.lot);
|
|
prtData += "^FO278,7^GB0,26,4^FS\r\n";
|
|
prtData += "^FT160,29^A0N,20,19^FH\\^FDSID^FS\r\n";
|
|
prtData += "^FT159,111^A0N,20,19^FH\\^FDPN^FS\r\n";
|
|
prtData += "^FT159,137^A0N,20,19^FH\\^FDRID^FS\r\n";
|
|
prtData += "^FT194,29^A0N,20,19^FH\\^FD" + reel.sid + "^FS\r\n";
|
|
prtData += "^FT324,29^A0N,20,19^FH\\^FD" + reel.lot + "^FS\r\n";
|
|
prtData += "^FT195,111^A0N,20,19^FH\\^FD" + reel.partnum + "^FS\r\n";
|
|
|
|
prtData += "^FT195,137^A0N,20,19^FH\\^FD" + (D1RID ? reel.id : string.Empty) + "^FS\r\n"; //210302
|
|
|
|
prtData += "^FT441,137^A0N,20,19^FH\\^FD" + reel.qty.ToString() + "^FS\r\n";
|
|
prtData += "^FT285,29^A0N,20,19^FH\\^FDLOT^FS\r\n";
|
|
prtData += "^FT396,137^A0N,20,19^FH\\^FDQTY^FS\r\n";
|
|
prtData += "^FO154,7^GB352,28,4^FS\r\n";
|
|
prtData += "^FO154,89^GB352,54,4^FS\r\n";
|
|
prtData += "^FO190,90^GB0,51,4^FS\r\n";
|
|
prtData += "^FO188,9^GB0,24,4^FS\r\n";
|
|
prtData += "^FO388,117^GB0,26,4^FS\r\n";
|
|
prtData += "^FO430,116^GB0,26,4^FS\r\n";
|
|
prtData += "^FO316,7^GB0,26,4^FS\r\n";
|
|
prtData += "^PQ1,0,1,Y^XZ\r\n";
|
|
return prtData;
|
|
}
|
|
public string makeZPL_210510(Reel reel, Boolean drawbox, out string qrData)
|
|
{
|
|
string m_strSend = string.Empty;
|
|
qrData = string.Format("{0};{1};{2};{3};{4};{5}", reel.sid, reel.lot, reel.partnum, reel.qty, reel.id, reel.mfg);
|
|
|
|
m_strSend = this.baseZPL;
|
|
m_strSend = m_strSend.Replace("{qrData}", qrData);
|
|
m_strSend = m_strSend.Replace("{sid}", reel.sid);
|
|
m_strSend = m_strSend.Replace("{lot}", reel.lot);
|
|
m_strSend = m_strSend.Replace("{partnum}", reel.partnum);
|
|
m_strSend = m_strSend.Replace("{rid}", reel.id);
|
|
m_strSend = m_strSend.Replace("{qty}", reel.qty.ToString());
|
|
m_strSend = m_strSend.Replace("{mfg}", reel.mfg);
|
|
m_strSend = m_strSend.Replace("{supply}", reel.manu);
|
|
|
|
//줄바꿈제거
|
|
m_strSend = m_strSend.Replace("\r", "").Replace("\n", "");
|
|
return m_strSend;
|
|
}
|
|
public string makeZPL_210908(Reel reel, Boolean drawbox, out string qrData)
|
|
{
|
|
string m_strSend = string.Empty;
|
|
qrData = string.Format("{0};{1};{2};{3};{4};{5};{6}", reel.sid, reel.lot, reel.manu, reel.qty, reel.id, reel.mfg, reel.partnum);
|
|
|
|
m_strSend = this.baseZPL;
|
|
m_strSend = m_strSend.Replace("{qrData}", qrData);
|
|
m_strSend = m_strSend.Replace("{sid}", reel.sid);
|
|
m_strSend = m_strSend.Replace("{lot}", reel.lot);
|
|
m_strSend = m_strSend.Replace("{partnum}", reel.partnum);
|
|
m_strSend = m_strSend.Replace("{rid}", reel.id);
|
|
m_strSend = m_strSend.Replace("{qty}", reel.qty.ToString());
|
|
m_strSend = m_strSend.Replace("{mfg}", reel.mfg);
|
|
m_strSend = m_strSend.Replace("{supply}", reel.manu);
|
|
|
|
//줄바꿈제거
|
|
m_strSend = m_strSend.Replace("\r", "").Replace("\n", "");
|
|
return m_strSend;
|
|
}
|
|
public Boolean TestPrint(Boolean drawbox, string manu = "", string mfgdate = "", Boolean Array7 = false)
|
|
{
|
|
var dtstr = DateTime.Now.ToShortDateString();
|
|
var printcode = "103077807;Z577603504;105-35282-1105;15000;RC00004A219001W;20210612";
|
|
var reel = new StdLabelPrint.Reel(printcode);
|
|
//reel.id = "RLID" + DateTime.Now.ToString("MMHHmmssfff");
|
|
reel.sid = "103000000";
|
|
reel.partnum = "PARTNO".PadRight(20, '0'); //20자리
|
|
|
|
if (mfgdate == "") reel.mfg = dtstr;
|
|
else reel.mfg = mfgdate;
|
|
|
|
reel.lot = "LOT000000000";
|
|
if (manu == "") reel.manu = "ATK4EET1";
|
|
else reel.manu = manu;
|
|
|
|
reel.qty = 15000;
|
|
var rlt = Print(reel, true, drawbox, Array7);
|
|
var fi = new System.IO.FileInfo(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "temp_zpl.txt"));
|
|
System.IO.File.WriteAllText(fi.FullName, LastPrintZPL, System.Text.Encoding.Default);
|
|
return rlt;
|
|
}
|
|
|
|
|
|
public Boolean Print(Reel reel, Boolean display1drid, Boolean drawOUtBox, Boolean Array7 = false)
|
|
{
|
|
string prtData;
|
|
if (Array7)
|
|
prtData = makeZPL_210908(reel, drawOUtBox, out qrData);
|
|
else
|
|
prtData = makeZPL_210510(reel, drawOUtBox, out qrData);
|
|
|
|
return Print(prtData);
|
|
}
|
|
|
|
public bool Print(string _zpl)
|
|
{
|
|
this.LastPrintZPL = _zpl;
|
|
|
|
bool retval = false;
|
|
System.IntPtr lhPrinter = new System.IntPtr();
|
|
DOCINFO di = new DOCINFO();
|
|
int pcWritten = 0;
|
|
//string st1;
|
|
// text to print with a form feed character
|
|
//st1 = "This is std label by using zpl\f";
|
|
di.pDocName = "Component Std Label";
|
|
di.pDataType = "RAW";
|
|
// the \x1b means an ascii escape character
|
|
|
|
//lhPrinter contains the handle for the printer opened
|
|
//If lhPrinter is 0 then an error has occured
|
|
|
|
//GetPrinterList();
|
|
|
|
//if (connectedPrinter.Contains(printerName) == false)
|
|
// throw new Exception("연결된 프린터가 아닙니다.");
|
|
|
|
|
|
PrintDirect.OpenPrinter(printerName, ref lhPrinter, 0);
|
|
PrintDirect.StartDocPrinter(lhPrinter, 1, ref di);
|
|
PrintDirect.StartPagePrinter(lhPrinter);
|
|
try
|
|
{
|
|
PrintDirect.WritePrinter(lhPrinter, _zpl, _zpl.Length, ref pcWritten);
|
|
retval = true;
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Console.WriteLine(e.Message);
|
|
}
|
|
PrintDirect.EndPagePrinter(lhPrinter);
|
|
PrintDirect.EndDocPrinter(lhPrinter);
|
|
PrintDirect.ClosePrinter(lhPrinter);
|
|
return retval;
|
|
}
|
|
private List<string> FindPrinters(PrinterEnumFlags Flags)
|
|
{
|
|
List<string> prtList = new List<string>();
|
|
uint cbNeeded = 0;
|
|
uint cReturned = 0;
|
|
if (PrintDirect.EnumPrinters(Flags, null, 2, IntPtr.Zero, 0, ref cbNeeded, ref cReturned))
|
|
{
|
|
return null;
|
|
}
|
|
int lastWin32Error = Marshal.GetLastWin32Error();
|
|
if (lastWin32Error == ERROR_INSUFFICIENT_BUFFER)
|
|
{
|
|
IntPtr pAddr = Marshal.AllocHGlobal((int)cbNeeded);
|
|
if (PrintDirect.EnumPrinters(Flags, null, 2, pAddr, cbNeeded, ref cbNeeded, ref cReturned))
|
|
{
|
|
PRINTER_INFO_2[] printerInfo2 = new PRINTER_INFO_2[cReturned];
|
|
int offset = pAddr.ToInt32();
|
|
Type type = typeof(PRINTER_INFO_2);
|
|
int increment = Marshal.SizeOf(type);
|
|
for (int i = 0; i < cReturned; i++)
|
|
{
|
|
printerInfo2[i] = (PRINTER_INFO_2)Marshal.PtrToStructure(new IntPtr(offset), type);
|
|
prtList.Add(printerInfo2[i].pPrinterName);
|
|
offset += increment;
|
|
}
|
|
Marshal.FreeHGlobal(pAddr);
|
|
return prtList;
|
|
}
|
|
lastWin32Error = Marshal.GetLastWin32Error();
|
|
}
|
|
throw new Win32Exception(lastWin32Error);
|
|
}
|
|
|
|
|
|
|
|
}
|
|
public class Reel
|
|
{
|
|
public string sid { get; set; }
|
|
public string lot { get; set; }
|
|
public string mfg { get; set; }
|
|
public int qty { get; set; }
|
|
public string id { get; set; }
|
|
//public string date { get; set; }
|
|
public string partnum { get; set; }
|
|
public string manu { get; set; }
|
|
|
|
public Reel()
|
|
{
|
|
Clear();
|
|
}
|
|
public void Clear()
|
|
{
|
|
sid = string.Empty;
|
|
lot = string.Empty;
|
|
mfg = string.Empty;
|
|
lot = string.Empty;
|
|
id = string.Empty;
|
|
//date = string.Empty;
|
|
partnum = string.Empty;
|
|
manu = string.Empty;
|
|
qty = 0;
|
|
}
|
|
public Reel(string _sid, string _lot, string _manu, int _qty, string _id, string _mfgdate, string _partnum)
|
|
{
|
|
int sidNum = 0;
|
|
if (int.TryParse(_sid, out sidNum) && sidNum.ToString().Length == 9)
|
|
sid = sidNum.ToString();
|
|
else
|
|
throw new Exception("SID가 숫자가 아니거나 9자리 숫자가 아닙니다.");
|
|
|
|
lot = _lot;
|
|
mfg = _mfgdate;
|
|
qty = _qty;
|
|
id = _id;
|
|
partnum = _partnum;
|
|
manu = _manu;
|
|
}
|
|
public Reel(string qrbarcodestr)
|
|
{
|
|
var spData = qrbarcodestr.Split(';');
|
|
if (spData.Length < 6)
|
|
throw new Exception("Barcode Length가 적습니다.");
|
|
|
|
sid = spData[0];
|
|
lot = spData[1];
|
|
manu = spData[2];
|
|
|
|
int _qty = 0;
|
|
|
|
if (int.TryParse(spData[3], out _qty))
|
|
qty = _qty;
|
|
else
|
|
throw new Exception("수량란에 숫자 정보가 아닙니다.");
|
|
|
|
id = spData[4];
|
|
mfg = spData[5];
|
|
if (spData.Length > 6) partnum = spData[6];
|
|
else partnum = string.Empty;
|
|
}
|
|
}
|
|
}
|