C#使用BarTender打印二维码,纸张一行一列或多列
使用组件
提取码:2bxq
打印 BarTender 文档
http://help.seagullscientific.com/2016/en/Subsystems/ActiveX/ActiveX.htm#printing_formats.htm
打印情况一:
如果打印次数不频繁,一次只是打印一个模板,前端可以进行直接获取到数据的情况,并且打印纸张是一行一列的,如:A4纸张单据打印。可以使用这种简单的方式:
private void btnPrint_Click(object sender, EventArgs e) { BarTender.Application btapp; BarTender.Format btformat; btapp = new BarTender.Application(); string str = $"{Application.StartupPath}\\model.btw";//程序目录下 btformat = btapp.Formats.Open(str, false, ""); btformat.SetNamedSubStringValue("Var1", "内容数据1");//条码 btformat.SetNamedSubStringValue("Var2", "内容数据2");//底部 btformat.PrintOut(false, false); //第二个参数设置是否跳出打印属性; btapp.Quit(BarTender.BtSaveOptions.btSaveChanges);//退出时同步退出bartender进程 }
PS:如果是一行多列的打印纸张,也可以把模板设置成多列,然后使用上面这种方法。不过就需要注意打印数据源的整理。
模板例子设置如下:
- 只需要添加组件;
- 修改嵌入数据源名称(名称和 etNamedSubStringValue 代码 Name 对应);
打印情况二:
如果打印是批量、多排的、使用单模板,如:产品条码条码打印。使用连接数据库方式打印。这里使用SQL Server方式连接例子
public void btnPrint_Click(bool UpdatePrintState) { #region 设置临时打印数据源 string printId = Guid.NewGuid().ToString("N");//打印批次标记 //情况一:创建一个临时打印表,把数据插入到临时表 //情况二:直接根据条件去数据库查询(不需要重新创建数据) #endregion #region 通过barTender模板来打印 BarTender.Application btapp; BarTender.Format btformat; btapp = new BarTender.Application(); string str = $"{Application.StartupPath}\\model2.btw";//程序目录下 btformat = btapp.Formats.Open(str, false, ""); BarTender.Database database = btformat.Databases.GetDatabase(1); database.SQLStatement += $" where printID='{printId}' order by RIGHT(Var1,7)";//填写SQL语句附加条件 database.Password = VSLoginInfo.SQLPassword; database.User = VSLoginInfo.SQLUser; btformat.PrintOut(false, false); //第二个参数设置是否跳出打印属性; btapp.Quit(BarTender.BtSaveOptions.btDoNotSaveChanges);//退出时同步退出bartender进程(SQL条件会改变,不更新模板信息) #endregion }
批量分批次打印
BarTender.Application btapp; BarTender.Format btformat; BarTender.Messages btMsgs; BarTender.BtPrintResult btPrintRtn; btapp = new BarTender.Application(); btformat = btapp.Formats.Open(str, false, ""); BarTender.Database database = btformat.Databases.GetDatabase(1); database.Password = VSLoginInfo.SQLPassword; database.User = VSLoginInfo.SQLUser; string sql = database.SQLStatement; foreach (string thisid in ids) { bar.StepProgressBar(1, string.Format("打印{0}任务...", thisid)); database.SQLStatement = sql + string.Format(" where printID='{0}' order by CONVERT(int,RIGHT(Var1,6))", thisid); //打印文档 btPrintRtn = btformat.Print("打印:"+thisid, true, -1, out btMsgs); // 检查是否有错误信息 if (btPrintRtn != BarTender.BtPrintResult.btSuccess) { foreach (BarTender.Message msg in btMsgs) { MessageBox.Show(msg.Message); } } Thread.Sleep(2000);//休眠2秒后执行 } btapp.Quit(BarTender.BtSaveOptions.btDoNotSaveChanges);//退出时同步退出bartender进程
批量打印异常问题:
实际应用中有时候会出现打印任务卡死(斑马打印机),具体情况为:条码已经打印,但是任务打印任务卡住了,无法结束,重启电脑后会打重复。猜测可能是打印页面太多,可以把数据分多次打印任务,每次调用打印后休眠2秒,Thread.Sleep(2000);。
模板例子设置如下:
- 数据库设置:连接数据库、选择表、设置查询语句;
- 修改嵌入数据源类型为【数据库字段】;
- 选择数据库绑定字段;
- 打印页面设置成一排多列;