import math import os import StringIO import subprocess import tempfile import time import cairo import flask import pango import pangocairo class App(flask.Flask): def __init__(self, *args, **kwargs): super(App, self).__init__(*args, **kwargs) self.last = 0 app = App(__name__) class Renderer(object): INCH_PER_MM = 0.039 DPI = 300 def __init__(self, size=(19,51)): width, height = [int(s * self.INCH_PER_MM * self.DPI) for s in size] surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height) context = cairo.Context(surface) # fill it white, while we're at it context.rectangle(0, 0, width, height) context.set_source_rgb(1, 1, 1) context.fill() context.translate(width, 0) context.rotate(math.pi/2) # yolo self.width, self.height = height, width self.context = context self.surface = surface def export_png(self, name): with open(name, 'w') as f: self.surface.write_to_png(f) def render_text(self, text, fontname, x, y): self.context.save() if y != -1: self.context.translate(x, y) pangocairo_context = pangocairo.CairoContext(self.context) pangocairo_context.set_antialias(cairo.ANTIALIAS_SUBPIXEL) layout = pangocairo_context.create_layout() layout.set_width(self.width*pango.SCALE) font = pango.FontDescription(fontname) layout.set_font_description(font) layout.set_text(text) layout.set_alignment(pango.ALIGN_CENTER) if y == -1: self.context.translate(0, (self.height - layout.get_size()[1]/pango.SCALE)/2) self.context.set_source_rgb(0, 0, 0) pangocairo_context.update_layout(layout) pangocairo_context.show_layout(layout) self.context.restore() @app.route('/') def index(): return flask.render_template('index.html') @app.route('/stuff/preview//') def stuff_preview(size): text = flask.request.args.get('text') r = Renderer() r.render_text(text, 'Sans {}'.format(size), 0, -1) sio = StringIO.StringIO() r.surface.write_to_png(sio) sio.seek(0) return flask.send_file(sio, mimetype='image/png') DELAY = 5 @app.route('/stuff/print//', methods=['POST']) def stuff_print(size): last = app.last print last, time.time() - last if time.time() - last < DELAY: return 'Please wait {} more seconds before next print.'.format(int(DELAY - (time.time() - last))) text = flask.request.args.get('text') r = Renderer() r.render_text(text, 'Sans {}'.format(size), 0, -1) path = '/tmp/hslabel' f = open(path, 'w') r.surface.write_to_png(f) f.flush() f.close() time.sleep(1) ex = 'lpr -P DYMO_LabelWriter_450 {}'.format(path) os.system(ex) f.close() app.last = time.time() return 'ok' if __name__ == '__main__': app.run(debug=True)