Come formattare la stringa Python per una particolare stampante POS

Nov 16 2020

Sto usando una stampante termica per ricevute POS-8330 che si trova QUI

Sto scrivendo codice che invia una stringa Python alla stampante, ecco il codice che lo fa

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

La stampante ha un manuale di programmazione che si trova QUI , ma non riesco a capire nulla da esso o in particolare come applicarlo. Gentilmente dammi un aiuto con quanto segue

  1. Per ridurre la dimensione del carattere
  2. Per ridurre i margini orizzontali in modo che la stampa possa iniziare dall'estrema sinistra.

Il codice che ho scritto fornisce questo risultato sulla stampante POS.

Su una normale stampante full size dà

che è esattamente quello che voglio.

Risposte

1 RolandSmith Nov 17 2020 at 18:31

Guardando il manuale, questa stampante utilizza caratteri di controllo (i primi 32 caratteri in ASCII) per avviare i comandi e separarli dal testo.

Quindi puoi alternare testo e comandi della stampante. Assicurati solo di aprire il file di output in binarymodalità!

Ad esempio, guardando a pagina 17 del manuale di programmazione, il comando ESC @ripristina la stampante. Questo comando è costituito da due caratteri (byte); decimale 27 seguito da decimale 64. Puoi creare quel comando come segue:

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

È necessario impostare il margine sinistro (comando GS L, pagina 37) e la larghezza dell'area di stampa (comando GS W, pagina 38). Notare che "unità di movimento orizzontale" è spiegato nel GS Pcomando a pagina 38. L'unità di movimento orizzontale predefinita è 25,4 / 180 = 0,1411 mm o 1/180 = 0,0055 pollici.

Quindi se vuoi impostare il margine sinistro a circa 5 mm (4,94 mm per la precisione), devi inviare il seguente comando:

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

Il valore 35 viene calcolato in questo modo:

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

Se si desidera anche impostare la larghezza di stampa a 60 mm, l'argomento del GS Wcomando dovrebbe essere:

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

È maggiore di 255, quindi dovrebbe essere distribuito su due byte;

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

Il comando sarebbe:

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

Puoi combinare questi comandi, penso:

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

Modificare:

Aggiungere i comandi di stampa ai dati è semplice:

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

Notare che è necessaria encodela stringa, poiché i comandi della stampante sono binari.

Notare inoltre che è necessario scrivere la stringa in un file in modalità binaria .

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

Infine, ho usato in withmodo che il file venga chiuso correttamente dopo la scrittura. Il modo in cui lo usi lascia il file aperto.