C#使用BarTender打印二维码,纸张一行一列或多列

使用组件

Interop.BarTender.dll

提取码: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:如果是一行多列的打印纸张,也可以把模板设置成多列,然后使用上面这种方法。不过就需要注意打印数据源的整理。

模板例子设置如下:

  1. 只需要添加组件;
  2. 修改嵌入数据源名称(名称和 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);。

 

模板例子设置如下:

  1. 数据库设置:连接数据库、选择表、设置查询语句;
  2. 修改嵌入数据源类型为【数据库字段】;
  3. 选择数据库绑定字段;
  4. 打印页面设置成一排多列;

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2021-08-29 08:36  小杨观世界  阅读(2527)  评论(1编辑  收藏  举报