Jak sformatować ciąg Python dla określonej drukarki POS
Używam termicznej drukarki pokwitowań POS-8330, którą znajdziesz TUTAJ
Piszę kod, który wysyła ciąg w języku Python do drukarki, oto kod, który to robi
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")
Drukarka ma instrukcję programowania , którą można znaleźć TUTAJ , ale nie mogę nic z niej wywnioskować, ani w szczególności, jak ją zastosować. Prosimy o pomoc w następujących kwestiach
- Aby zmniejszyć rozmiar czcionki
- Aby zmniejszyć poziome marginesy, aby wydruk mógł się zaczynać od skrajnego lewego.
Kod, który napisałem, daje taki wynik na drukarce POS.
Na zwykłej drukarce pełnowymiarowej daje
czyli dokładnie to, czego chcę.
Odpowiedzi
Patrząc na instrukcję, ta drukarka używa znaków sterujących (pierwsze 32 znaki ASCII) do uruchamiania poleceń i oddzielania ich od tekstu.
Możesz więc przeplatać tekst i polecenia drukarki. Po prostu otwórz plik wyjściowy w binarytrybie!
Na przykład, patrząc na stronę 17 instrukcji programowania, polecenie ESC @resetuje drukarkę. To polecenie składa się z dwóch znaków (bajtów); decimal 27, a następnie decimal 64. Możesz utworzyć to polecenie w następujący sposób:
In [7]: bytes([27,64])
Out[7]: b'\x1b@'
Musisz ustawić lewy margines (polecenie GS L, strona 37) i szerokość obszaru drukowania (polecenie GS W, strona 38). Zwróć uwagę, że „jednostki ruchu poziomego” są wyjaśnione w GS Ppoleceniu na stronie 38. Domyślna jednostka ruchu poziomego to 25,4 / 180 = 0,1411 mm lub 1/180 = 0,0055 cala.
Więc jeśli chcesz ustawić lewy margines na około 5 mm (dokładnie 4,94 mm), musisz wysłać następujące polecenie:
dIn [14]: bytes([29, 76, 35,0])
Out[14]: b'\x1dL#\x00'
Wartość 35 jest obliczana w następujący sposób:
In [13]: round(5/(25.4/180))
Out[13]: 35
Jeśli chcesz również ustawić szerokość druku na 60 mm, to argumentem GS Wpolecenia musiałby być:
In [15]: round(60/(25.4/180))
Out[15]: 425
Jest większa niż 255, więc musiałaby zostać rozłożona na dwa bajty;
In [17]: 425-256
Out[17]: 169
Polecenie byłoby następujące:
In [18]: bytes([29, 87, 169,1])
Out[18]: b'\x1dW\xa9\x01'
Możesz łączyć te polecenia, myślę:
In [20]: bytes([29, 76, 35, 0, 29, 87, 169,1])
Out[20]: b'\x1dL#\x00\x1dW\xa9\x01'
Edytować:
Dodawanie poleceń drukowania do danych jest łatwe:
printdata = b'\x1dL#\x00\x1dW\xa9\x01' + finalString.encode('utf-8')
Zwróć uwagę, że encodeciąg jest potrzebny, ponieważ polecenia drukarki są binarne.
Zwróć również uwagę, że musisz zapisać ciąg do pliku w trybie binarnym .
with open(self.filename, "wb") outf:
outf.write(printdata)
os.startfile(self.filename, "print")
Ostatecznie posłużyłem się withtak, aby plik został poprawnie zamknięty po zapisaniu. Sposób, w jaki go używasz, powoduje, że plik jest otwarty.