はじめに
サーマルプリンタはインクジェットプリンタやレーザープリンタと比べ、長期保管には向かない、画質が低い、などのデメリットがある一方で、安価、メンテナンスフリー、立ち上がりが早い、などから以前から気になっていた。
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かいの へいさ
□ メダカのエサやり
□ ザリガニのエサやり