LoginSignup
7
3

More than 5 years have passed since last update.

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

Posted at

はじめに

サーマルプリンタはインクジェットプリンタやレーザープリンタと比べ、長期保管には向かない、画質が低い、などのデメリットがある一方で、安価、メンテナンスフリー、立ち上がりが早い、などから以前から気になっていた。
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アプリで出力して毎朝子供に渡してやってもらっているのだが、毎朝印刷するのが面倒なので。。)

<イメージ>
xxのやることリスト

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3