3

我有一个 Odoo 实现,我需要将阿拉伯语单词打印到 ESC/POS 打印机。

Odoo 社区已经开发了一个 Python 模块,可以将 UTF-8 文本转换为 ESC/POS 代码页。问题是,当我打印阿拉伯文本时,我得到了颠倒的文本和断开的字母。

如何将正确的阿拉伯语单词从 Python 打印到 ESC/POS?

请参阅参考的Escpos.text方法escpos.py

4

1 回答 1

3

如评论中所述,在嵌入式设备上正确显示 UTF-8 阿拉伯文本并不是一项简单的任务。您需要处理文本方向、连接和字符编码。

我过去曾尝试过使用我维护的PHP ESC/POS 驱动程序,但无法在本机 ESC/POS 中加入阿拉伯字符。但是,我最终决定采用这种打印图像的解决方法(PHP)。

解决此问题的基本步骤是:

  • 获取阿拉伯字体、一些文本库和图像库
  • 加入(“重塑”)角色
  • 使用双向文本布局算法将 UTF-8 转换为 LTR(打印)顺序
  • 将其拍在图像上,右对齐
  • 打印图像

要将其移植到 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 具有类似的对齐和图像输出命令。

免责声明:我不会说或写一点阿拉伯语,所以我不能确定这是正确的。我只是在视觉上将打印输出与谷歌翻译给我的内容进行比较。

谷歌翻译正在使用中

于 2016-09-10T12:02:03.753 回答