Как отформатировать строку Python для конкретного POS-принтера

Nov 16 2020

Я использую термопринтер POS-8330, который можно найти ЗДЕСЬ

Я пишу код, который отправляет строку Python на принтер, вот код, который выполняет это

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

У принтера есть руководство по программированию, которое можно найти ЗДЕСЬ , но я не могу ничего понять из него или, в частности, как его применять. Пожалуйста, помогите мне со следующими

  1. Чтобы уменьшить размер шрифта
  2. Чтобы уменьшить горизонтальные поля, чтобы печать могла начинаться с самого левого края.

Написанный мной код дает такой результат на POS-принтере.

На обычном полноразмерном принтере дает

это именно то, что я хочу.

Ответы

1 RolandSmith Nov 17 2020 at 18:31

Судя по руководству, этот принтер использует управляющие символы (первые 32 символа в ASCII) для запуска команд и отделения их от текста.

Таким образом, вы можете перемежать текст и команды принтера. Только убедитесь, что выходной файл открыт в binaryрежиме!

Например, если посмотреть на страницу 17 руководства по программированию, команда ESC @перезагружает принтер. Эта команда состоит из двух символов (байтов); десятичное число 27, за которым следует десятичное число 64. Вы можете создать эту команду следующим образом:

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

Вам необходимо установить левое поле (команда GS L, стр. 37) и ширину области печати (команда GS W, стр. 38). Обратите внимание, что «единицы перемещения по горизонтали» объясняются в GS Pкоманде на странице 38. Единица измерения горизонтального перемещения по умолчанию составляет 25,4 / 180 = 0,1411 мм или 1/180 = 0,0055 дюйма.

Поэтому, если вы хотите установить левое поле примерно на 5 мм (4,94 мм, если быть точным), вам необходимо отправить следующую команду:

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

Значение 35 рассчитывается следующим образом:

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

Если вы также хотите установить ширину печати 60 мм, то аргумент GS Wкоманды должен быть:

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

Это больше 255, поэтому его придется распределить по двум байтам;

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

Команда будет такой:

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

Думаю, вы можете комбинировать эти команды:

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

Редактировать:

Добавить команды печати к данным очень просто:

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

Обратите внимание, что вам нужна encodeстрока, поскольку команды принтера являются двоичными.

Также обратите внимание, что вам нужно записать строку в файл в двоичном режиме.

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

Наконец, я использовал, withчтобы файл после записи правильно закрывался. То, как вы его используете, оставляет файл открытым.