¿Imprimir palabras en árabe de Python a ESC / POS impresora?

Tengo una implementación de Odoo y necesito imprimir palabras en árabe en una impresora ESC / POS.

La comunidad de Odoo ya ha desarrollado un módulo de Python que traduce el texto UTF-8 a la página de códigos ESC / POS. El problema es que cuando imprimo texto en árabe, obtengo texto invertido y letras desconectadas.

¿Cómo imprimo la palabra árabe correcta de Python a ESC / POS?

Vea el método Escpos.text de escpos.py para referencia.

Como se señaló en los comentarios, no es una tarea trivial mostrar el texto en árabe UTF-8 correctamente en un dispositivo integrado. Necesitas manejar la dirección del texto, la unión y la encoding de caracteres.

He intentado esto en el pasado para un controlador PHP ESC / POS que mantengo, y no pude unirme a caracteres árabes en ESC / POS nativo. Sin embargo, terminé decidiéndome por esta solución (PHP) que imprimía imágenes en su lugar.

Los pasos básicos para solucionar esto son:

  • Obtén una fuente en árabe, algunas bibliotecas de texto y una biblioteca de imágenes
  • Unir (‘remodelar’) a los personajes
  • Convierta el orden UTF-8 a LTR (impresión), usando el algoritmo de diseño de texto bidi
  • Golpearlo en una imagen, alineado a la derecha
  • Imprimir la imagen

Para portar esto a Python, presté en esta respuesta usando Wand . La Biblioteca de imágenes de Python (PIL) mostraba signos diacríticos como caracteres separados, lo que hace que la salida no sea adecuada.

Las dependencias se enumeran en los comentarios.

 #!/usr/bin/env python # -*- coding: utf-8 -*- # Print an Arabic string to a printer. # Based on example from escpos-php # Dependencies- # - pip install wand python-bidi python-escpos # - sudo apt-get install fonts-hosny-thabit # - download arabic_reshaper and place in arabic_reshaper/ subfolder import arabic_reshaper from escpos import printer from bidi.algorithm import get_display from wand.image import Image as wImage from wand.drawing import Drawing as wDrawing from wand.color import Color as wColor # Some variables fontPath = "/usr/share/fonts/opentype/fonts-hosny-thabit/Thabit.ttf" textUtf8 = u"بعض النصوص من جوجل ترجمة" tmpImage = 'my-text.png' printFile = "/dev/usb/lp0" printWidth = 550 # Get the characters in order textReshaped = arabic_reshaper.reshape(textUtf8) textDisplay = get_display(textReshaped) # PIL can't do this correctly, need to use 'wand'. # Based on # https://stackoverflow.com/questions/5732408/printing-bidi-text-to-an-image im = wImage(width=printWidth, height=36, background=wColor('#ffffff')) draw = wDrawing() draw.text_alignment = 'right'; draw.text_antialias = False draw.text_encoding = 'utf-8' draw.text_kerning = 0.0 draw.font = fontPath draw.font_size = 36 draw.text(printWidth, 22, textDisplay) draw(im) im.save(filename=tmpImage) # Print an image with your printer library printer = printer.File(printFile) printer.set(align="right") printer.image(tmpImage) printer.cut() 

La ejecución del script le da un PNG e imprime lo mismo en una impresora en “/ dev / usb / lp0”.

Ejemplo de salida

Esta es una demostración independiente de python-escpos , pero supongo que Odoo tiene comandos similares para la alineación y la salida de imágenes.

Descargo de responsabilidad: no hablo ni escribo en árabe, aunque sea un poco, así que no puedo estar seguro de que esto sea correcto. Solo estoy comparando visualmente la impresión con lo que el traductor de Google me dio.

Traductor de Google en uso