วิธีจัดรูปแบบ Python String สำหรับเครื่องพิมพ์ POS โดยเฉพาะ

Nov 16 2020

ฉันใช้เครื่องพิมพ์ใบเสร็จความร้อน POS-8330 อยู่ที่นี่

ฉันกำลังเขียนโค้ดที่ส่งสตริง 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: [email protected]"
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")

เครื่องพิมพ์มีคู่มือการเขียนโปรแกรมอยู่ที่นี่แต่ฉันไม่สามารถทำอะไรออกมาได้หรือโดยเฉพาะอย่างยิ่งวิธีการใช้งาน กรุณาให้ความช่วยเหลือฉันเกี่ยวกับสิ่งต่อไปนี้

  1. เพื่อลดขนาดตัวอักษร
  2. เพื่อลดระยะขอบแนวนอนเพื่อให้งานพิมพ์เริ่มจากด้านซ้ายสุด

รหัสที่ฉันเขียนให้ผลลัพธ์นี้บนเครื่องพิมพ์ POS

ในเครื่องพิมพ์ขนาดเต็มปกติจะให้

ซึ่งเป็นสิ่งที่ฉันต้องการ

คำตอบ

1 RolandSmith Nov 17 2020 at 18:31

เมื่อดูคู่มือเครื่องพิมพ์นี้ใช้อักขระควบคุม (32 อักขระแรกใน ASCII) เพื่อเริ่มคำสั่งและแยกออกจากข้อความ

คุณจึงสามารถสลับคำสั่งข้อความและเครื่องพิมพ์ได้ อย่าลืมเปิดไฟล์เอาต์พุตใน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เพื่อให้ไฟล์ถูกปิดอย่างถูกต้องหลังจากเขียน วิธีที่คุณใช้เปิดไฟล์ไว้