我有一个 Odoo 实现,我需要将阿拉伯语单词打印到 ESC/POS 打印机。
Odoo 社区已经开发了一个 Python 模块,可以将 UTF-8 文本转换为 ESC/POS 代码页。问题是,当我打印阿拉伯文本时,我得到了颠倒的文本和断开的字母。
如何将正确的阿拉伯语单词从 Python 打印到 ESC/POS?
请参阅参考的Escpos.text
方法escpos.py
。
我有一个 Odoo 实现,我需要将阿拉伯语单词打印到 ESC/POS 打印机。
Odoo 社区已经开发了一个 Python 模块,可以将 UTF-8 文本转换为 ESC/POS 代码页。问题是,当我打印阿拉伯文本时,我得到了颠倒的文本和断开的字母。
如何将正确的阿拉伯语单词从 Python 打印到 ESC/POS?
请参阅参考的Escpos.text
方法escpos.py
。
如评论中所述,在嵌入式设备上正确显示 UTF-8 阿拉伯文本并不是一项简单的任务。您需要处理文本方向、连接和字符编码。
我过去曾尝试过使用我维护的PHP ESC/POS 驱动程序,但无法在本机 ESC/POS 中加入阿拉伯字符。但是,我最终决定采用这种打印图像的解决方法(PHP)。
解决此问题的基本步骤是:
要将其移植到 python,我使用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 具有类似的对齐和图像输出命令。
免责声明:我不会说或写一点阿拉伯语,所以我不能确定这是正确的。我只是在视觉上将打印输出与谷歌翻译给我的内容进行比较。