So formatieren Sie Python String für einen bestimmten POS-Drucker

Nov 16 2020

Ich verwende einen Thermobondrucker POS-8330, den Sie HIER finden

Ich schreibe Code, der eine Python-Zeichenfolge an den Drucker sendet. Hier ist der Code, der dies erreicht

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

Der Drucker hat HIER ein Programmierhandbuch gefunden , aber ich kann nichts davon erkennen oder insbesondere, wie man es anwendet. Bitte helfen Sie mir bei folgenden Fragen

  1. So reduzieren Sie die Schriftgröße
  2. Reduzieren der horizontalen Ränder, damit der Ausdruck ganz links beginnen kann.

Der Code, den ich geschrieben habe, gibt dieses Ergebnis auf dem POS-Drucker.

Auf einem normalen Drucker in voller Größe gibt es

Das ist genau das, was ich will.

Antworten

1 RolandSmith Nov 17 2020 at 18:31

Im Handbuch verwendet dieser Drucker Steuerzeichen (die ersten 32 Zeichen in ASCII), um Befehle zu starten und sie vom Text zu trennen.

So können Sie Text- und Druckerbefehle einstreuen. Stellen Sie einfach sicher, dass Sie die Ausgabedatei im binaryModus öffnen !

Auf Seite 17 des Programmierhandbuchs setzt der Befehl beispielsweise ESC @den Drucker zurück. Dieser Befehl besteht aus zwei Zeichen (Bytes). Dezimal 27 27 gefolgt von Dezimal 64. Sie können diesen Befehl wie folgt erstellen:

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

Sie müssen den linken Rand (Befehl GS L, Seite 37) und die Druckbereichsbreite (Befehl GS W, Seite 38) einstellen . Beachten Sie, dass "horizontale Bewegungseinheiten" im GS PBefehl auf Seite 38 erläutert werden . Die standardmäßige horizontale Bewegungseinheit ist 25,4 / 180 = 0,1411 mm oder 1/180 = 0,0055 Zoll.

Wenn Sie also den linken Rand auf ungefähr 5 mm (genauer gesagt 4,94 mm) einstellen möchten, müssen Sie den folgenden Befehl senden:

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

Der Wert 35 wird wie folgt berechnet:

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

Wenn Sie auch die Druckbreite auf 60 mm einstellen möchten, muss das Argument für den GS WBefehl lauten:

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

Dies ist größer als 255, daher müsste es auf zwei Bytes verteilt werden.

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

Der Befehl wäre:

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

Sie können diese Befehle kombinieren, denke ich:

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

Bearbeiten:

Das Hinzufügen der Druckbefehle zu den Daten ist einfach:

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

Beachten Sie, dass Sie encodedie Zeichenfolge benötigen , da die Druckerbefehle binär sind.

Beachten Sie auch, dass Sie die Zeichenfolge im Binärmodus in eine Datei schreiben müssen .

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

Schließlich habe ich verwendet, withdamit die Datei nach dem Schreiben richtig geschlossen wird. Die Art und Weise, wie Sie es verwenden, lässt die Datei offen.