源文章地址
源文章链接
应用背景
通过调用第三方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
clr.AddReference("Seagull.BarTender.Print")
from Seagull.BarTender.Print import Engine, Printers
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 get_data_dict(self, key=None):
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
def set_data_dict(self, data_dict):
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"
}
b= BarTender()
b.getPrinterList()
b.creatTask()
b.btFormat.PrintSetup.PrinterName = b.printerName
将以上程序作为模块集成到主程序中
import bartender
'''
以下为截取的定义的函数程序片段
#有时候如果强制关闭程序或者程序因出错卡死,会导致程序没有执行bartender的回收工作,这样bartender会一直在后台占用
#我这边的解决办法是在主程序开始运行时先关闭任务管理器中已存在的所有bartender进程
#如果有更好的办法望各位看官不吝赐教
'''
def initPrinter(self):
cmd = "taskkill /F /IM " + "bartend.exe"
os.system(cmd)
time.sleep(1)
try:
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):
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.
解决办法: 打开控制台 注册应用程序
bartend.exe /register
更新日期: 2022/6/24
|