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コードと連結してテプラで印刷しやすいように加工だ。
こんな感じ
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で実行してみた。
なぜ謹賀新年w
あ、今日から令和。おめでとう。