Cara memformat Python String untuk printer POS tertentu

Nov 16 2020

Saya menggunakan Thermal Receipt Printer POS-8330 ditemukan DI SINI

Saya menulis kode yang mengirimkan string python ke printer, berikut adalah kode yang menyelesaikan ini

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

Printer memiliki manual pemrograman yang dapat ditemukan DI SINI , tetapi saya tidak dapat melihat apa pun darinya atau secara khusus bagaimana menerapkannya. Mohon beri saya bantuan dengan yang berikut ini

  1. Untuk mengurangi ukuran font
  2. Untuk mengurangi margin horizontal agar hasil cetak dapat dimulai dari paling kiri.

Kode yang saya tulis memberikan hasil ini pada printer POS.

Pada printer ukuran penuh biasa yang diberikan

itulah yang saya inginkan.

Jawaban

1 RolandSmith Nov 17 2020 at 18:31

Melihat manual, printer ini menggunakan karakter kontrol (32 karakter pertama dalam ASCII) untuk memulai perintah dan memisahkannya dari teks.

Jadi, Anda dapat menyelingi teks dan perintah printer. Pastikan untuk membuka file keluaran dalam binarymode!

Misalnya, lihat halaman 17 dari manual pemrograman, perintah ESC @mereset printer. Perintah ini terdiri dari dua karakter (byte); desimal 27 diikuti oleh desimal 64. Anda dapat membuat perintah itu sebagai berikut:

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

Anda harus mengatur margin kiri (perintah GS L, halaman 37) dan lebar area pencetakan (perintah GS W, halaman 38). Perhatikan bahwa "unit gerakan horizontal" dijelaskan dalam GS Pperintah di halaman 38. Satuan gerakan horizontal default adalah 25,4 / 180 = 0,1411 mm atau 1/180 = 0,0055 inci.

Jadi jika Anda ingin mengatur margin kiri menjadi sekitar 5 mm (tepatnya 4,94 mm), Anda harus mengirimkan perintah berikut:

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

Nilai 35 dihitung seperti ini:

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

Jika Anda juga ingin menyetel lebar pencetakan menjadi 60 mm, maka argumen untuk GS Wperintahnya adalah:

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

Ini lebih besar dari 255, jadi itu harus tersebar di dua byte;

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

Perintahnya adalah:

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

Anda dapat menggabungkan perintah ini, saya pikir:

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

Edit:

Menambahkan perintah cetak ke data itu mudah:

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

Perhatikan bahwa Anda perlu encodestring, karena perintah printer adalah biner.

Perhatikan juga bahwa Anda perlu menulis string ke file dalam mode biner .

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

Akhirnya, saya menggunakannya withagar file ditutup dengan benar setelah menulis. Cara Anda menggunakannya membiarkan file terbuka.