我有一个Odoo实现,我需要将阿拉伯语单词打印到ESC / POS打印机。
Odoo社区已经开发了一个Python模块,可以将UTF-8文本转换为ESC / POS代码页。问题是当我打印阿拉伯语文本时,我得到了反向文本和断开连接的字母。
如何从Python到ESC / POS打印正确的阿拉伯语单词?
请参阅escpos.py
中的Escpos.text
方法以供参考。
答案 0 :(得分:1)
如评论中所述,在嵌入式设备上正确显示UTF-8阿拉伯语文本并非易事。您需要处理文本方向,连接和字符编码。
我过去曾尝试使用PHP ESC/POS driver来维护,并且无法在本地ESC / POS中加入阿拉伯字符。但是,我确实最终选择了打印图像的this workaround(PHP)。
解决这个问题的基本步骤是:
要将此端口移植到python,我使用this answer借助Wand。 Python图像库(PIL)将变音符号显示为单独的字符,使输出不合适。
依赖项列在评论中。
#!/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()
运行脚本会为您提供PNG,然后将其打印到" / dev / usb / lp0"的打印机。
这是一个独立的python-escpos演示,但我假设Odoo具有类似的对齐和图像输出命令。
免责声明:我甚至不会说话或写阿拉伯语,所以我无法确定这是否正确。我只是直观地将打印输出与Google翻译给我的内容进行比较。