源文章地址
应用背景
通过调用第三方C#库,你可以非常方便地打印出你想要的条码,同时不受打印机的限制。
所需环境
1,bartender软件
2,python及其配套运行环境
安装bartender软件
1,首先明确你的系统是X86还是X64,然后安装系统对应版本的bartender
2,bartender有不同的应用版本,这里推荐Enterprise Automation版本
3,安装完成后找到对应目录下的SDK文件夹,找到对应的dll文件
注!:这里非常需要关注的是,如果你的系统是x64的,你也可以顺利运行x86版本的bartender。这时你需要检查你的python是否也是32bit版本的。这里可以打开CMD输入“python”去检查版本。32bit版本的python只能调用x86的dll文件。
4,将这个dll文件复制到你的python工作区间目录下方便调用。
新建bartender文件
1,新建文件,按需创建一个bartender模板。作为演示我在这里直接点完成
2,在工具栏中添加一个QR码到模板中,双击二维码设置。自己定义数据源名称,在python程序中,你自定义的二维码内容将会通过数据源名称传入。
python上位机代码
import clr #通过这个模块来调用C#的dll库
#加载dll库
clr.AddReference("Seagull.BarTender.Print")
from Seagull.BarTender.Print import Engine, Printers
#可能会出现“Import "Seagull.BarTender.Print" could not be resolved”这个波浪线错误,这里不用管
class BarTender():#创建打印机类方便在上位机主程序中调用
def __init__(self,filePath):
#启用引擎
self.btEngine = Engine(True)
self.filePath = filePath
def getPrinterList(self):#获取你电脑上的打印机列表
printers = Printers()
printerList = []
for printer in printers:
printerList.append(printer.PrinterName)
self.printerName = printers.Default.PrinterName#这里为了方便,将要打印机确定为默认打印机
#默认打印机只需在电脑的控制面板中设定即可
def creatTask(self):#创建打印任务
self.btFormat = self.btEngine.Documents.Open(self.filePath)
#调试过程中发现保存功能无法生效
# def abortTask(self):
# self.btEngine.Stop(SaveOptions.SaveChanges)
def get_data_dict(self, key=None):#获取你的标签文件.btw的内容
data_dict = {}
if self.btFormat:
if key:
return self.btFormat.SubStrings[key].Value
for substring in self.btFormat.SubStrings:
data_dict[substring.Name] = substring.Value
return data_dict
# 传入一个字典:{'num':11111}则会把num变量的值设置为11111
def set_data_dict(self, data_dict):#将你需要的数据源内容内容写入到标签.btw文件中
if len(data_dict) and self.btFormat:
for key, value in data_dict.items():
for substring in self.btFormat.SubStrings:
if substring.Name == key:
self.btFormat.SubStrings.SetSubString(key, value)
def __del__(self):
#关闭引擎,释放资源
if self.btEngine.IsAlive:
self.btEngine.Stop()
self.btEngine.Dispose()
if __name__ == "__main__":
dict = {
"num" : "1234567"
}
#key:"num"为在bartender中命名的数据源,value:"1234567"为你想输出的条码内容
b= BarTender()#path为先前设计的标签路径
b.getPrinterList()
b.creatTask()
b.btFormat.PrintSetup.PrinterName = b.printerName
将以上程序作为模块集成到主程序中
import bartender#将上述文件命名为bartender.py。然后导入
'''
以下为截取的定义的函数程序片段
#有时候如果强制关闭程序或者程序因出错卡死,会导致程序没有执行bartender的回收工作,这样bartender会一直在后台占用
#我这边的解决办法是在主程序开始运行时先关闭任务管理器中已存在的所有bartender进程
#如果有更好的办法望各位看官不吝赐教
'''
def initPrinter(self):
#关闭所有已存在的bartender进程
cmd = "taskkill /F /IM " + "bartend.exe"
os.system(cmd)
time.sleep(1)
try:
#生成bartender对象
self.seagullBartender = bartender.BarTender(self.btwPath)
#生成目标文件对象
self.seagullBartender.creatTask()
#搜寻默认打印机
self.seagullBartender.getPrinterList()
#绑定打印机
self.seagullBartender.btFormat.PrintSetup.PrinterName = self.seagullBartender.printerName
except :
print("打印机初始化失败!")
'''
因为这段程序是嵌入到一个主程序中的。如果在主程序的运行过程中打开bartender会耗费较长的时间
所以这边我用线程让bartender在后台先打开,不去干扰主程序的运行
'''
def initPrinterThread(self,filepath = None):
seagullInitThread = threading.Thread(target=self.initPrinter)
seagullInitThread.start()
'''
调用打印机函数,在适当的时机调用来打印内容
'''
def printBarcode(self):
#字典里的是在bartender里链接的内容
dict = {
'a': None, 'b': None
}
self.seagullBartender.set_data_dict(dict)
#开始打印
result = self.seagullBartender.btFormat.Print("printjob",2000)
print(result)
if __name__ == "__main__":
initPrinterThread()
printBarcode()
有时候会出现以下报错:
Seagull.BarTender.Print.PrintEngineException: The BarTender engine could not be started.
Possible reasons are:
1) BarTender is not properly installed.
2) BarTender is not properly registered on the computer (e.g bartend.exe /register).
3) There are too many process instances of BarTender running. Stop a few bartend.exe instances and try again. Also see SDK Engine.Start method documentation for information about how to allow more BarTender processes to run on your computer by increasing your "non-interactive" shared desktop heap.
4) The user account does not have permission to run BarTender.
解决办法:
打开控制台
注册应用程序
cd bartend.exe路径
bartend.exe /register
更新日期:
2023/5/31