前面试了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就是模板文件,这里还有要注意的地方!!
网上很多教程说创建变量的时候是添加任意,但是我在测试的时候发现选择添加任意类型的变量并不能调用已创建的变量,如果程序在这部分有问题的话可以选择填充器类型的变量,结果输出的都是一样的,祝各位苦逼程序员好运。