今天看到学友 水若寒 发的文章
自己开发的access程序调用bartender自动生成二维码、条形码并打印标签
http://www.accessoft.com/article-show.asp?id=17583
很欣喜的发现也有人和我一样使用Bartender自动化打印标签
但是我的方法和他不一样,特开贴分享下我的经验
水若寒使用的是引用BT,然后使用vba编程的方式,这个对bt的版本有要求,必须是Automation(自动化)版本,professional(专业)版会提示错误
我使用的是命令行参数的方式,只需要professional版本就可以使用,下载地址在文末
他的流程是打开bt,打开模板,(写入单个数据,打印),关闭且不保存模板,关闭bt
其中括号部分可以重复,标签数量少时,耗时差不多,但是频繁打印固定的一个模板时,这种耗时会比较长,因为bt向打印机发送两次打印任务之间会有延时
我的流程是打开bt,预加载模板,(导出数据,打印),关闭bt且不保存模板
其中括号部分可以重复,当使用同个模板打印多个标签时,合并打印任务可以显著缩减等待时间
例如使用模板一打印1000个不同的标签,他的方法需要分别发送打印命令1000次,我的只需要导出一次文件,发送一次打印指令
准备工作:
先用bt设计好模板,具体操作使用bt的应该会,我这里是用过了一个多行文本框设置了脚本,然后下面是条形码
接着添加并绑定数据源
首先你按照模板中使用的字段以及单个标签的数量生成一个csv,顺序不限,需要注意的是CSV文件的格式标准,有兴趣自己百度下
快捷键Ctrl+D打开数据库设置
点击添加,选择文本文件,下一步
然后输入文件名称,这里可以使用相对地址,如下图,直接输入文件名,就表示是模板文件同目录下
然后下一步再下一步,一般建议选择是,就是表示csv文件的第一行带有标题,方便查看
完成后如下
然后把模板中的字段绑定数据源字段
接下来设置打印份数
Ctrl+P快捷键打开设置窗口,选择最后一个,由数据源设置
然后在数据源中配置表示单标签打印数量的字段
保存,准备工作完成,开始关键部分
下面简要说明下我的程序思路
因为我的程序是放在仓库使用的,固定的两个模板打印频率很高,因此打开打印程序时预先打开bt并且加载模板
如:c:\btw\bartend.exe /f=<格式名称>
当需要打印时,把数据写入CSV并保存关闭
然后发送命令 c:\btw\bartend.exe /p 这里bt程序会自动检测是否已经有bt在运行,如有会自动转发命令到第一个bt,退出后面的bt
(我下面的C#实现直接发送到第一个bt,缩减了一部分延迟)
假如需要切换模板F2.btw 发送c:\btw\bartend.exe /AF=F2.btw
程序退出前 发送 c:\btw\bartend.exe /x 指示bt程序退出
vba部分我是用Excel实现的,access应该是类似的
程序打开时 加载bt并且预加载模板 /min=SystemTray 这个表示最小化到任务 taskbar表示最小化到任务栏
Dim btCMD
btCMD = BT路径 & " /f=" & Chr(34) & ActiveWorkbook.Path & "\通用内标.btw" & Chr(34) & " /f=" & Chr(34) & ActiveWorkbook.Path & "\通用内标.btw" & Chr(34) & " /min=SystemTray"
Shell (btCMD)
查询数据然后导出CSV部分根据自己的需求来做吧,毕竟每个人的数据都不一样
提示下,CSV这里是支持多行的,看我的附件就明白了
开始打印通用内标这个标签,打印其他标签同理,改下名字就可以,也可以动态拼接
Dim btCMD
btCMD = BT路径 & "/AF=通用内标.btw /P /min=SystemTray"
Shell(btCMD)
程序退出前,退出bt
Dim btCMD
btCMD = BT路径 & "/x"
Shell(btCMD)
我们仓库的打印程序是我用C#实现的,导出数据部分就不贴了
这里为了提高速度,我直接获取了进程id,排除了二次启动的延迟
打印部分主要代码如下
private void LoadBT()
{
Process[] Po = Process.GetProcessesByName("bartend");
if (Po.Length > 0)
{
BtId = Po[0].Id;
Log("Bartender已经开始运行,进程ID为" + BtId.ToString());
}
else
{
Process p = new Process();
p.StartInfo.WorkingDirectory = this.txtBartenderPath.Text;
p.StartInfo.FileName = "bartend.exe";
p.StartInfo.Arguments = "/f=\"" + System.Windows.Forms.Application.StartupPath + @"\通用外标.btw" + "\" /f=\"" + System.Windows.Forms.Application.StartupPath + @"\通用内标.btw" + " \"/min=SystemTray";
p.EnableRaisingEvents = true;
p.Start();
BtId = p.Id;
Log("Bartender已经开始加载,进程ID为" + BtId.ToString());
}
}
//BtId为Bartender进程的Id
private int BtId;
////// 调用bartender打印指定模板,在系统托盘最小化模式
private void RunBT()
{
Process p;
try
{
p = Process.GetProcessById(BtId);
}
catch
{
Log("BarTender已经退出!将重新启动!");
LoadBT();
p = Process.GetProcessById(BtId);
}
if (chkBarIn.Checked)
{
p.StartInfo.FileName = "bartend.exe";
p.StartInfo.Arguments = "/AF=通用内标.btw /P /min=SystemTray";
p.Start();
}
if (chkBarOut.Checked)
{
p.StartInfo.FileName = "bartend.exe";
p.StartInfo.Arguments = "/AF=通用外标.btw /P /min=SystemTray";
p.Start();
}
if (chkFileStatus.Checked)
{
label9.Text = "开始读取";
timer2.Enabled = true;
waitBt = true;
BTreading = false;
txtInput.Enabled = false;
}
}
下面是我们目前使用的模板及CSV,可以下载研究下
Bt模板及CSV示例
百度云下载Bartender9.4版本带注册机
使用方法:
安装选择试用
完毕后拔网线
打开软件-帮助-激活向导
打开注册机
product type 选择 Bartender professional edition
复制下面的激活码填入Bartender里面
然后下一步
最后会提示错误
再选择电话激活
把显示的代码填入注册机
下面算出来的激活码填入软件激活即可
最后插上网线继续做你的事情.