前面試了C++通過調用WIN32API來實現打印,但是發現這種打印方式要自己把圖片畫上去,而且還要自己調整位置才能把標簽准確的打印到標簽上,遇到二維碼什么的還要自己畫一個。所以這次通過C#調用CODESOFT的庫來完成打印。
這里說一下為什么不用C++,其實是可以用的,但是CODESOFT的DLL庫是用C#寫的,用C++調用的時候總是報這樣的那樣的錯誤,實在比較麻煩,所以干脆采用C#來實現打印功能。(此處給C#掌聲)
首先,安裝CODESOFT軟件,這里選擇企業版,目前只有企業版可以使用這種方式打印調用,其他版本並不支持,我這里選擇的版本是CODESOFT7。
如果是默認安裝的話,安裝完畢之后可以在C:\Program Files (x86)\Tki\7\Common文件夾下發現Lppx2.tlb這個文件,這個就是我們需要引用的文件,我們在C#上添加引用這個文件,然后右鍵LabelManager2屬性,嵌入互操作類型改為FALSE,不然的話可能會調用失敗。調用CODESOFT打印的代碼如下:
private static Regex ItemReg = new Regex("^[\u53d8\u91cf]"); private static int filenameflag = 0; private static string filename; private static int bianliangflag = 0; private static string bianliang; private static int printnumflag; private static string printnum; static private void PrintClick(string[] m) { LabelManager2.ApplicationClass lbl = null; LabelManager2.Document doc = null; try { foreach(string s in m) { //Console.WriteLine("s : " + s.ToString()); //讀取模板,如果模板參入參數不對就退出 if (filenameflag == 1) { string TempValue = s; string labFileName = System.Windows.Forms.Application.StartupPath + "\\" + TempValue;//模板文件在當前目錄下 Console.WriteLine(labFileName); if (!File.Exists(labFileName)) { Console.WriteLine(labFileName); Console.WriteLine("not found file , please check! "); return; } lbl = new LabelManager2.ApplicationClass();//新建模板對象 lbl.Documents.Open(labFileName, false);//打開模板 doc = lbl.ActiveDocument; doc.Printer.SwitchTo("ZDesigner 110Xi4 600 dpi", "USB001", true);//選擇打印機 filenameflag = 0; } if (s.ToString() == "FileName") { filenameflag = 1; filename = s.ToString(); } if( bianliangflag == 1 ) { string TempValue = s; Console.WriteLine("變量值 : " + TempValue); doc.Variables.FormVariables.Item(bianliang.ToString()).Value = s.ToString(); Console.WriteLine(doc.Variables.FormVariables.Item(bianliang.ToString()).Value); bianliangflag = 0; }
if (ItemReg.IsMatch(s.ToString())) { bianliangflag = 1; bianliang = s.ToString(); } if (printnumflag == 1) { string TempValue = s; int printnumc = Convert.ToInt32(TempValue); doc.PrintLabel(printnumc); doc.FormFeed(); printnumflag = 0; } if(s.ToString() == "printnum") { printnumflag = 1; printnum = s.ToString(); } } } catch (Exception ex) { Console.Write(ex.Message); } finally { lbl.Documents.CloseAll(); lbl.Quit(); lbl = null; doc = null; } }
這個是通過傳參進行的,通過;來對參數切割,主函數調用方法如下:
static void Main(string[] args) { string str = args[0]; Console.WriteLine(str); string[] sArray = Regex.Split(str, ";", RegexOptions.IgnoreCase); foreach (string item in sArray) { Console.WriteLine(item); } PrintClick(sArray); }
傳值方法為:
FileName;1.lab;變量0;11221122;變量1;4546546;printnum;1
這個1.lab就是模板文件,這里還有要注意的地方!!
網上很多教程說創建變量的時候是添加任意,但是我在測試的時候發現選擇添加任意類型的變量並不能調用已創建的變量,如果程序在這部分有問題的話可以選擇填充器類型的變量,結果輸出的都是一樣的,祝各位苦逼程序員好運。