2016-07-31 20 views
3

私はOdooの実装を持っており、アラビア語をESC/POSプリンタに印刷する必要があります。PythonからESC/POSプリンタにアラビア語を印刷しますか?

Odooコミュニティは、すでにUTF-8テキストをESC/POSコードページに変換するPythonモジュールを開発しました。問題は、私がアラビア語のテキストを印刷するときに、逆のテキストと切り離された文字が得られることです。

PythonからESC/POSに正しいアラビア語を印刷するにはどうすればよいですか?

参照のためにescpos.pyからEscpos.textメソッドを参照してください。

+0

私はあなたのアラビア語のテキストが左から右へではなく、右から左に表示されるようになっていると思いたいです。プリンタが左から右のテキストのみを処理できる場合は、必要に応じて文字の並び順を逆にするために、エンコーディング変換コードを編集する必要があります。私は、テキストの方向が変わるときを教えてくれる特別なUnicode文字があると思いますが、答えがどのように機能するかを説明するのに十分な情報がありません。 – Blckknght

+0

「アラビア文字を正しく印刷する」は、UTF8からプリンタの文字セットに変換するだけではありません。あなたが見てきたように(1:「反転」)、テキストは右から左に表示される必要がありますが、コードは左から右の順番で(ほとんどの場合)送信されます。しかし、ソフトウェアはそれを簡単に修正することができます。 Alas、(2: "disconnected")は、最初、内側、および最終結合文字を正しく計算するのが少し難しくなります。 – usr2564301

+0

(興味のある人のために:アラビア語の手紙は適切な言葉を形成するために参加する必要があります現在ラドワンは 'TEXTLIKETHIS'の類推ですが、それも間違った順序であるので、' SIHTEKILEROM') – usr2564301

答えて

0

コメントに記載されているように、組み込みデバイスでUTF-8アラビア語のテキストを正しく表示することは簡単なことではありません。テキストの方向、結合、文字のエンコーディングを処理する必要があります。

これまで私が保守していたPHP ESC/POS driverの試みがありましたが、ネイティブESC/POSでアラビア文字に参加できませんでした。しかし、代わりに画像を印刷したthis workaround(PHP)に解決しました。

これを回避作業の基本的な手順は以下のとおりです。

  • はアラビア語フォント、テキストライブラリ、画像ライブラリ
  • は(「リシェイプ」)に参加ゲット文字
  • はUTF-を変換しますLTR(印刷)ために8、右
  • 印刷画像整列
  • スラップそれを画像上で、双方向テキストレイアウトアルゴリズムを用い

これをPythonに移植するには、Wandを使用してthis answerに貸し出しました。 Python Image Library(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

関連する問題