热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

应用背景通过调用第三方C#库,你可以非常方便地打印出你想要的条码,同时不受打印机的限制。所需环境1,bartender软件2,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.

解决办法:
打开控制台
注册应用程序

bartend.exe /register

更新日期:
2022/6/24



推荐阅读
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 本文介绍了win7系统休眠功能无法启动和关闭的解决方法,包括在控制面板中启用休眠功能、设置系统休眠的时间、通过命令行定时休眠、手动进入休眠状态等方法。 ... [详细]
  • 在2022年,随着信息化时代的发展,手机市场上出现了越来越多的机型选择。如何挑选一部适合自己的手机成为了许多人的困扰。本文提供了一些配置及性价比较高的手机推荐,并总结了选择手机时需要考虑的因素,如性能、屏幕素质、拍照水平、充电续航、颜值质感等。不同人的需求不同,因此在预算范围内找到适合自己的手机才是最重要的。通过本文的指南和技巧,希望能够帮助读者节省选购手机的时间。 ... [详细]
  • 本文记录了作者对x265开源代码的实现与框架进行学习与探索的过程,包括x265的下载地址与参考资料,以及在Win7 32 bit PC、VS2010平台上的安装与配置步骤。 ... [详细]
  • 本文介绍了如何在Azure应用服务实例上获取.NetCore 3.0+的支持。作者分享了自己在将代码升级为使用.NET Core 3.0时遇到的问题,并提供了解决方法。文章还介绍了在部署过程中使用Kudu构建的方法,并指出了可能出现的错误。此外,还介绍了开发者应用服务计划和免费产品应用服务计划在不同地区的运行情况。最后,文章指出了当前的.NET SDK不支持目标为.NET Core 3.0的问题,并提供了解决方案。 ... [详细]
  • 微软评估和规划(MAP)的工具包介绍及应用实验手册
    本文介绍了微软评估和规划(MAP)的工具包,该工具包是一个无代理工具,旨在简化和精简通过网络范围内的自动发现和评估IT基础设施在多个方案规划进程。工具包支持库存和使用用于SQL Server和Windows Server迁移评估,以及评估服务器的信息最广泛使用微软的技术。此外,工具包还提供了服务器虚拟化方案,以帮助识别未被充分利用的资源和硬件需要成功巩固服务器使用微软的Hyper - V技术规格。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • 在加载一个第三方厂商的dll文件时,提示“找不到指定模块,加载失败”。由于缺乏必要的技术支持,百思不得期间。后来发现一个有用的工具 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • springboot启动不了_Spring Boot + MyBatis 多模块搭建教程
    作者:枫本非凡来源:www.cnblogs.comorzlinp9717399.html一、前言1、创建父工程最近公司项目准备开始重构,框 ... [详细]
author-avatar
结婚吧结婚吧结婚吧_813
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有