POS-5805DDを使った出力実験と応用

# はじめに
サーマルプリンタはインクジェットプリンタやレーザープリンタと比べ、長期保管には向かない、画質が低い、などのデメリットがある一方で、安価、メンテナンスフリー、立ち上がりが早い、などから以前から気になっていた。
iOSの専用アプリから出力することも可能だが、ここではmacからUSB接続で出力した結果をまとめた。

# 環境

- Aibecy POS-5805DD (USB接続)
- macOS Sierra
- Python 3.4.4
- Pillow (4.2.1)
- numpy (1.13.1)
- python-escpos (2.2.0)
- pyusb (1.0.0)

# 実験

## 文字の出力
これで文字出力が出来る。

    from escpos.printer import Usb
    p = Usb(0x0416, 0x5011, out_ep=3)
    p.text('abcdefg')

但し、日本語出力は文字化けしてしまう。

    from escpos.printer import Usb
    p = Usb(0x0416, 0x5011, out_ep=3)
    p.text('あいうえお')

## 画像の出力

これで画像出力が出来る。
ここでは白黒2値画像を与えている。
ちなみに、横幅は384ピクセルを指定。

    from escpos.printer import Usb
    
    p = Usb(0x0416, 0x5011, out_ep=3)
    p.image('output.png')

# 応用

## 領収書の作成

PILライブラリで白黒2値画像を作成し、
pngファイルで保存した後、
image関数でプリントすると、
任意のフォーマットで出力できる。
これを応用して、領収書を出力した。

自治会の会費徴収時の領収書発行を想定していて
宛名と金額が固定しているので、
一度に作成している。
＜控＞は自治会への提出用。

```
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy

import PIL.Image
import PIL.ImageDraw
import PIL.ImageFont

from escpos.printer import Usb

from time import sleep

g_pos_y = 0

def draw_text(img, text, align='left', size=24):
  global g_pos_y
  draw = PIL.ImageDraw.Draw(img)
  draw.font = PIL.ImageFont.truetype(
    'AquaKana.ttc', size)

  img_size = numpy.array(img.size)
  txt_size = numpy.array(draw.font.getsize(text))
  pos = (img_size - txt_size) / 2
  
  if align == 'center':
    x = ((img_size - txt_size) / 2)[0]
  elif align == 'right':
    x = (img_size - txt_size)[0]
  else:
    x = 0

  #draw.text(pos, text, (0, 0, 0))
  draw.text((x, g_pos_y), text, (0, 0, 0))
  g_pos_y += size

def create_img(name, tadashi, copy=''):
  global g_pos_y
  g_pos_y = 0

  img = PIL.Image.new('RGB', (384, 550), (255,255,255))
  
  draw_text(img, '領収書' + copy, align='center', size=48)
  draw_text(img, ' ')
  draw_text(img, '平成29年10月31日', align='right')
  draw_text(img, ' ')
  draw_text(img, name + ' 様', size=36)
  draw_text(img, ' ')
  draw_text(img, '===================', align='center')
  draw_text(img, '金額 ¥1,000円', align='center', size=36)
  draw_text(img, '===================', align='center')
  draw_text(img, ' ')
  draw_text(img, '但し、')
  draw_text(img, tadashi + 'として')
  draw_text(img, '上記正に領収致しました。')
  draw_text(img, '                                ')
  draw_text(img, '      〒xxx-xxxx xxx市xxxxx', align='right')
  draw_text(img, '                 xx公民館内', align='right')
  draw_text(img, '                   xx自治会', align='right', size=36)
  draw_text(img, '               担当：　　　', align='right')
  gray = img.convert('L')
  img = gray.point(lambda x: 0 if x < 128 else 255)
  #img.show()
  img.save('output.png')

def main():
  names = [
    '神社 太郎',
    '神社 次郎',
    '神社 三郎',
  ]
  tadashi = 'xx神社祭典運営費拠出金'
  
  for name in names:
    create_img(name, tadashi)
    sleep(0.5)
    p = Usb(0x0416, 0x5011, out_ep=3)
    p.image('output.png')
    p.text('\n\n\n')

    print('Please hit any key')
    input()
   
    create_img(name, tadashi, copy=' ＜控＞')
    sleep(0.5)
    p = Usb(0x0416, 0x5011, out_ep=3)
    p.image('output.png')
    p.text('\n\n\n')

    print('Please hit any key')
    input()
   

main()
```

# まとめ

文字出力は、英語が出来たが日本語ができなかった。
一方、画像出力は、問題なく出力できた。
領収書も問題なく出力でき、実際に領収書として使った。

なぜ動くのか、なぜ動かないのか、が解らないところがいくつかあったのが今回の課題である。

今後は、Raspberry Piに接続し、例えば、Google Homeにお願いしたら、IFTTT経由でRaspberry Piにリクエストが飛び、それを契機にTODOリストを出力する、応用をやってみたいと思う。
（既にiOSアプリで出力して毎朝子供に渡してやってもらっているのだが、毎朝印刷するのが面倒なので。。）

```
＜イメージ＞
ｘｘのやることリスト

□ コップ
□ タオル
□ あそびぎ（月と木だけ）
□ たいおんけい
□ れんらくちょう
□ かおをあらう
□ おふろの じかん せってい
□ おふろの せん
□ おきがえ
□ かばんの ようい
□ しょくせんき の せんざい
□ 2かいの へいさ
□ メダカのエサやり
□ ザリガニのエサやり
```