python - 如何为特定的 POS 打印机格式化 Python 字符串
问题描述
我正在编写将 python 字符串发送到打印机的代码,这是完成此操作的代码
companyName = "Hilton Steel and Cement"
paytype = self.payment_Mode
companyName = companyName + "\n\nSale Receipt\n\nOpp Golden Line Mall\nP.O BOX 3404-20100\n TEL: 0727441192\nEMAIL: Hiltonltd@yandex.com"
receiptNo = randint(1, 100000)
finalString = companyName + "\n\nReceipt No:" + str(receiptNo) + "\n\n" + self.getproductList()\
+ "\n______________________________________\n" + "Total Due: " + str(self.totaltoBePaid) + "\n______________________________________\n\n" + "Paid In: " + paytype + "\n\n"+ "Served By: " + str(self.user) +"\n" + "Payment: " + str(self.finalvariables[1])+ "\nBalance: " + str(self.finalvariables[0]) + "\n\n\nWelcome Back"
open(self.filename, "w").write(finalString)
os.startfile(self.filename, "print")
这台打印机有一个编程手册在这里找到,但我无法从中找出任何东西,尤其是如何应用它。请在以下方面给我一些帮助
- 减小字体大小
- 减少水平边距,以便打印输出可以从最左边开始。
在普通的全尺寸打印机上,它提供
这正是我想要的。
解决方案
查看手册,这台打印机使用控制字符(ASCII 中的前 32 个字符)来启动命令并将它们与文本分开。
所以你可以穿插文本和打印机命令。只要确保以binary
模式打开输出文件!
例如,查看编程手册的第 17 页,该命令ESC @
重置打印机。该命令由两个字符(字节)组成;十进制 27 后跟十进制 64。您可以按如下方式创建该命令:
In [7]: bytes([27,64])
Out[7]: b'\x1b@'
您必须设置左边距(命令GS L
,第 37 页)和打印区域宽度(命令GS W
,第 38 页)。请注意,“水平运动单位”GS P
在第 38 页的命令中进行了说明。默认水平运动单位为 25.4/180 = 0.1411 毫米或 1/180 = 0.0055 英寸。
因此,如果要将左边距设置为大约 5 毫米(准确地说是 4.94 毫米),则必须发送以下命令:
dIn [14]: bytes([29, 76, 35,0])
Out[14]: b'\x1dL#\x00'
值 35 的计算方式如下:
In [13]: round(5/(25.4/180))
Out[13]: 35
如果您还想将打印宽度设置为 60 毫米,则该GS W
命令的参数必须是:
In [15]: round(60/(25.4/180))
Out[15]: 425
这大于 255,所以它必须分布在两个字节上;
In [17]: 425-256
Out[17]: 169
命令将是:
In [18]: bytes([29, 87, 169,1])
Out[18]: b'\x1dW\xa9\x01'
你可以结合这些命令,我认为:
In [20]: bytes([29, 76, 35, 0, 29, 87, 169,1])
Out[20]: b'\x1dL#\x00\x1dW\xa9\x01'
编辑:
将打印命令添加到数据很容易:
printdata = b'\x1dL#\x00\x1dW\xa9\x01' + finalString.encode('utf-8')
请注意,您确实需要encode
字符串,因为打印机命令是二进制的。
另请注意,您需要将字符串以二进制模式写入文件。
with open(self.filename, "wb") outf:
outf.write(printdata)
os.startfile(self.filename, "print")
最后,我使用with
了使文件在写入后正确关闭。您使用它的方式使文件保持打开状态。
推荐阅读
- java - Springboot中使用@Cacheable时JVM使用的内存
- r - Assigning elements to a list in a nested purrr map
- azure - 如何在 Azure 功能中实现代流?失败并显示“AADSTS50000:发行令牌时出错”
- java - 在Java中打印嵌套地图而不使用instanceof运算符
- php - 使用 PHP 的 SOAP XML 请求不起作用 - 可能是标头问题
- html - 基于没有类的祖先的 CSS 选择器
- javascript - 打印时如何用PDF替换网站
- c# - UnityEngine.Component' 不包含“速度”的定义
- javascript - 如何获得 HTML 下拉菜单以降低开始
- javascript - 乘法测验中的猜测次数