打印从Python到ESC / POS打印机的阿拉伯语单词?

时间:2016-07-31 11:50:42

标签: python escpos

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

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

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

请参阅escpos.py中的Escpos.text方法以供参考。

1 个答案:

答案 0 :(得分:1)

如评论中所述,在嵌入式设备上正确显示UTF-8阿拉伯语文本并非易事。您需要处理文本方向,连接和字符编码。

我过去曾尝试使用PHP ESC/POS driver来维护,并且无法在本地ESC / POS中加入阿拉伯字符。但是,我确实最终选择了打印图像的this workaround(PHP)。

解决这个问题的基本步骤是:

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

要将此端口移植到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"的打印机。

Output example

这是一个独立的python-escpos演示,但我假设Odoo具有类似的对齐和图像输出命令。

免责声明:我甚至不会说话或写阿拉伯语,所以我无法确定这是否正确。我只是直观地将打印输出与Google翻译给我的内容进行比较。

Google translate in use