Cách định dạng chuỗi Python cho máy in POS cụ thể

Nov 16 2020

Tôi đang sử dụng Máy in hóa đơn nhiệt POS-8330 được tìm thấy TẠI ĐÂY

Tôi đang viết mã gửi một chuỗi python đến máy in, đây là mã thực hiện điều này

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")

Máy in có sách hướng dẫn lập trình được tìm thấy TẠI ĐÂY , nhưng tôi không thể tìm hiểu bất cứ điều gì về nó hoặc cụ thể là cách áp dụng nó. Vui lòng giúp tôi một số vấn đề sau

  1. Để giảm kích thước phông chữ
  2. Để giảm lề ngang để bản in có thể bắt đầu từ bên trái xa nhất.

Đoạn mã tôi đã viết cho kết quả này trên máy in POS.

Trên một máy in kích thước đầy đủ thông thường, nó cho

đó là chính xác những gì tôi muốn.

Trả lời

1 RolandSmith Nov 17 2020 at 18:31

Nhìn vào sách hướng dẫn, máy in này sử dụng các ký tự điều khiển (32 ký tự đầu tiên trong ASCII) để bắt đầu các lệnh và tách chúng khỏi văn bản.

Vì vậy, bạn có thể xen kẽ các lệnh văn bản và máy in. Chỉ cần đảm bảo mở tệp đầu ra ở binarychế độ!

Ví dụ, xem trang 17 của sách hướng dẫn lập trình, lệnh ESC @sẽ đặt lại máy in. Lệnh này bao gồm hai ký tự (byte); thập phân 27 theo sau bởi thập phân 64. Bạn có thể tạo lệnh đó như sau:

In [7]: bytes([27,64])
Out[7]: b'\x1b@'

Bạn phải đặt lề trái (lệnh GS L, trang 37) và chiều rộng vùng in (lệnh GS W, trang 38). Lưu ý rằng "đơn vị chuyển động ngang" được giải thích trong GS Plệnh trên trang 38. Đơn vị chuyển động ngang mặc định là 25,4 / 180 = 0,1411 mm hoặc 1/180 = 0,0055 inch.

Vì vậy, nếu bạn muốn đặt lề trái khoảng 5 mm (chính xác là 4,94 mm), bạn phải gửi lệnh sau:

dIn [14]: bytes([29, 76, 35,0])
Out[14]: b'\x1dL#\x00'

Giá trị 35 được tính như sau:

In [13]: round(5/(25.4/180))
Out[13]: 35

Nếu bạn cũng muốn đặt chiều rộng in thành 60 mm, thì đối số cho GS Wlệnh sẽ phải là:

In [15]: round(60/(25.4/180))
Out[15]: 425

Đây là lớn hơn 255, vì vậy nó sẽ phải được trải rộng trên hai byte;

In [17]: 425-256
Out[17]: 169

Lệnh sẽ là:

In [18]: bytes([29, 87, 169,1])
Out[18]: b'\x1dW\xa9\x01'

Bạn có thể kết hợp các lệnh này, tôi nghĩ:

In [20]: bytes([29, 76, 35, 0, 29, 87, 169,1])
Out[20]: b'\x1dL#\x00\x1dW\xa9\x01'

Biên tập:

Thêm các lệnh in vào dữ liệu thật dễ dàng:

printdata = b'\x1dL#\x00\x1dW\xa9\x01' + finalString.encode('utf-8')

Lưu ý rằng bạn cần đến encodechuỗi, vì các lệnh máy in là nhị phân.

Cũng lưu ý rằng bạn cần ghi chuỗi vào tệp ở chế độ nhị phân .

with open(self.filename, "wb") outf:
    outf.write(printdata)
os.startfile(self.filename, "print")

Cuối cùng, tôi đã sử dụng withđể tệp được đóng đúng cách sau khi viết. Cách bạn đang sử dụng để tệp mở.