【非原创】python调用bartender操控打印机打印条码

源文章地址

源文章链接

应用背景

通过调用第三方C#库,你可以非常方便地打印出你想要的条码,同时不受打印机的限制。

所需环境

1,bartender软件
2,python及其配套运行环境

安装bartender软件

1,首先明确你的系统是X86还是X64,然后安装系统对应版本的bartender
2,bartender有不同的应用版本,这里推荐Enterprise Automation版本
版本
3,安装完成后找到对应目录下的SDK文件夹,找到对应的dll文件
SDK
注!:这里非常需要关注的是,如果你的系统是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

Bartender是一种用于打印标签和条形码的软件,可以通过Python进行调用和控制。通过Python调用Bartender模板打印可以实现自动化标签打印。 首先,我们需要安装Bartender软件并创建所需的标签模板。接下来,在Python中使用相关库来实现调用Bartender模板打印的功能。 一种常见的方法是使用COM组件来与Bartender进行通信。在Python中,我们可以使用`win32com.client`库来实现与COM组件的交互。我们需要使用Bartender的COM服务器的ProgID来创建COM对象,并通过该对象来打开Bartender模板。 下面是一个简单的示例代码: ```python import win32com.client def print_with_bartender(template_path, data): bartender = win32com.client.Dispatch("Bartender.Application") # 创建Bartender COM对象 bartender.Visible = True # 可选,使Bartender可见 # 打开Bartender模板 label_format = bartender.Formats.Open(template_path, False, "") label_format.SetNamedSubStringValue("Data", data) # 设置模板中的变量值 # 打印 label_format.PrintOut(False, False) # 关闭Bartender模板和程序 label_format.Close(0) bartender.Quit(0) # 调用函数进行打印 print_with_bartender("C:/path/to/template.btw", "数据内容") ``` 在这个示例中,我们首先创建了一个Bartender COM对象,并将其设为可见。然后通过调用`Formats.Open()`方法打开指定的Bartender模板,并通过`SetNamedSubStringValue()`方法设置模板中的变量值,这里例子中设置了一个名为"Data"的变量,并传入了要打印的数据。最后,通过调用`PrintOut()`方法进行打印,再关闭模板和Bartender程序。 需要注意的是,由于Bartender的COM组件是基于Windows平台的,所以上述代码只能在Windows环境下运行。Bartender官方提供了更详细的文档和示例代码,可以根据具体需求进行参考和调整。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值