Cómo formatear Python String para una impresora POS en particular

Nov 16 2020

Estoy usando una Impresora Térmica de Recibos POS-8330 que se encuentra AQUÍ

Estoy escribiendo un código que envía una cadena de Python a la impresora, aquí está el código que logra esto

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 impresora tiene un manual de programación que se encuentra AQUÍ , pero no puedo distinguir nada de él o, en particular, cómo aplicarlo. Por favor, ayúdeme con lo siguiente

  1. Para reducir el tamaño de fuente
  2. Para reducir los márgenes horizontales para que la impresión pueda comenzar desde el extremo izquierdo.

El código que he escrito da este resultado en la impresora POS.

En una impresora normal de tamaño completo,

que es exactamente lo que quiero.

Respuestas

1 RolandSmith Nov 17 2020 at 18:31

Al mirar el manual, esta impresora utiliza caracteres de control (los primeros 32 caracteres en ASCII) para iniciar comandos y separarlos del texto.

Para que pueda intercalar texto y comandos de impresora. ¡Solo asegúrese de abrir el archivo de salida en binarymodo!

Por ejemplo, mirando la página 17 del manual de programación, el comando ESC @reinicia la impresora. Este comando consta de dos caracteres (bytes); decimal 27 seguido de decimal 64. Puede crear ese comando de la siguiente manera:

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

Debe establecer el margen izquierdo (comando GS L, página 37) y el ancho del área de impresión (comando GS W, página 38). Tenga en cuenta que las "unidades de movimiento horizontal" se explican en el GS Pcomando de la página 38. La unidad de movimiento horizontal predeterminada es 25,4 / 180 = 0,1411 mm o 1/180 = 0,0055 pulgadas.

Entonces, si desea establecer el margen izquierdo en aproximadamente 5 mm (4,94 mm para ser precisos), debe enviar el siguiente comando:

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

El valor 35 se calcula así:

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

Si también desea establecer el ancho de impresión en 60 mm, entonces el argumento para el GS Wcomando debería ser:

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

Esto es mayor que 255, por lo que tendría que distribuirse en dos bytes;

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

El comando sería:

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

Puedes combinar estos comandos, creo:

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

Editar:

Agregar los comandos de impresión a los datos es fácil:

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

Tenga en cuenta que necesita encodela cadena, ya que los comandos de la impresora son binarios.

También tenga en cuenta que debe escribir la cadena en un archivo en modo binario .

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

Finalmente, utilicé withpara que el archivo se cierre correctamente después de escribir. La forma en que lo está utilizando deja el archivo abierto.