kuroの覚え書き

96の個人的覚え書き

QRコードをpythonで作る(その2)

QRコード生成をFlaskのwebアプリから行ってみる。
2つのパターンを想定。
前もってデータベースのIDごとのQRコードを生成。
データベースの1エントリーからQRコードを生成。

from functools import wraps
from flask import request, redirect, url_for, render_template, session
from flask_wtf import FlaskForm
from werkzeug import secure_filename
from wtforms import StringField, IntegerField, SubmitField, BooleanField
from ..models import Test
from testDB import Session
import os, shutil,, qrcode

class qrForm(FlaskForm):
    id = StringField('ID')
    qr1 = IntegerField('min')
    qr2 = IntegerField('max')
    submit = SubmitField('Submit')

@app.route('/qr/', methods=['GET', 'POST'])
def qr_index():
    form = qrForm()
    p_id = request.args.get('id', type = str)
    session = Session()
    q = session.query(Test)

# qr1~qr2の連番でQRコードをまとめて生成する。
    if form.qr1.data:
        dir = "./qr"
        if os.path.exists(dir):
            shutil.rmtree(dir)
        if not os.path.exists(dir):
            os.makedirs(dir)
        min = form.qr1.data
        max = form.qr2.data + 1
        for qr in range(min, max):
            qr = str(qr)
            img = qrcode.make('http://k-kuro.hatenadiary.jp/test_edit/?id=' + qr)
            data = dir + "/id_" + qr + '.png'
            img.save(data)
        flash('QR codes generated')


#データベースから1エントリーを選んでQRコードを生成。
    if p_id:
        # q = q.filter(Test.id==p_id).one()
        # plant_id = q[2]
        # date = q[4]
        # owner = q[8]   #この辺はまだ実装していない
        dir = "./qr"
        if os.path.exists(dir):
            shutil.rmtree(dir)
        if not os.path.exists(dir):
            os.makedirs(dir)
        img = qrcode.make('http://k-kuro.hatenadiary.jp/test_edit/?id=' + p_id)
        data = dir + "/id_" + p_id + '.png'
        img.save(data)
        flash('QR code generated')
    return render_template('qr.html', form=form, contents=q)

だいたいこんな感じで./qrディレクトリに画像が作られることを確認。
これをダウンロードする仕組みとテプラなり、タックシールなりに印刷する手段を考えないと。

#今回のアドレスは架空。

for loopの中でintとstrを連結しようとしてハマったのはお約束。
やっぱりちゃんとローカルでテストしながらやらないと遠回りになるな

次は文字を画像化してQRコードと連結してテプラで印刷しやすいように加工だ。
f:id:k-kuro:20190501194050p:plain
こんな感じ

Pillow(PIL)で文字列を画像として保存(位置・サイズ自動調整) - cloverrose's blog
指定のフォントファイルを使って描画した文字列を画像ファイルに保存 - 強火で進め
Python, Pillowで画像を縦・横に連結(結合) | note.nkmk.me
この辺を参考に

fontとしてIPAフォントを使ってみる
IPAexフォント/IPAフォント | IPAフォントのダウンロードサイトです

import sys
from PIL import ImageFont
from PIL import Image
from PIL import ImageDraw

fontFile = 'ipaexg.ttf'
font = ImageFont.truetype(fontFile, 64, encoding='utf-8')

text = u'謹賀新年'
w, h = font.getsize(text)

print('%s w:%d h:%d' % (text, w, h))

im = Image.new('RGB', (w, h), (255,255,255))
draw = ImageDraw.Draw(im)
draw.text((0, 0), text, fill=(0,0,0), font=font)

im.show() 
im.save('image.png')

載っていたコードをちょいといじってpython3で実行してみた。
f:id:k-kuro:20190501220442p:plain
なぜ謹賀新年w
あ、今日から令和。おめでとう。