labelmaker/labelmaker/main.py

108 lines
3.3 KiB
Python
Raw Normal View History

2015-08-29 23:46:34 +00:00
import json
2015-08-29 22:46:51 +00:00
import math
import os
import subprocess
import time
2024-02-01 20:15:33 +00:00
import cairocffi as cairo
2015-08-29 22:46:51 +00:00
import flask
import img2pdf
2024-02-01 20:15:33 +00:00
import pangocffi as pango
import pangocairocffi as pangocairo
import requests
2015-08-29 22:46:51 +00:00
app = flask.Flask(__name__)
2015-08-29 22:46:51 +00:00
class Renderer(object):
INCH_PER_MM = 0.039
DPI = 300
2024-02-01 20:15:33 +00:00
def __init__(self, size=(36, 89)):
2015-08-29 22:46:51 +00:00
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)
2015-08-29 22:46:51 +00:00
context.rectangle(0, 0, width, height)
context.set_source_rgb(1, 1, 1)
context.fill()
2015-08-29 22:46:51 +00:00
context.translate(width, 0)
context.rotate(math.pi/2)
2024-02-01 20:15:33 +00:00
2015-08-29 22:46:51 +00:00
self.width, self.height = height, width
2024-02-01 20:15:33 +00:00
self.font = pango.FontDescription()
2015-08-29 22:46:51 +00:00
self.context = context
self.surface = surface
def export_png(self, name):
2024-02-01 20:15:33 +00:00
with open(name, 'wb') as f:
2015-08-29 22:46:51 +00:00
self.surface.write_to_png(f)
def render_text(self, text, fontname, x, y, html=False):
2024-02-01 20:15:33 +00:00
print("Fontname:", fontname)
2015-08-29 22:46:51 +00:00
self.context.save()
if y != -1:
self.context.translate(x, y)
2024-02-01 20:15:33 +00:00
self.context.set_antialias(cairo.ANTIALIAS_SUBPIXEL)
layout = pangocairo.create_layout(self.context)
layout._set_width(pango.units_from_double(self.width))
layout._set_alignment(pango.Alignment.CENTER)
if html:
# Absolutely horrifying hack to fix broken text wrapping
2024-02-01 20:15:33 +00:00
layout.apply_markup('<span font_desc="%s">%s</span>' % (fontname, text))
else:
2024-02-01 20:15:33 +00:00
self.font.family = fontname.split()[0]
self.font.size = pango.units_from_double(int(fontname.split()[1]))
2024-02-01 20:15:33 +00:00
layout.font_description = self.font
layout.text = text
2015-08-29 22:46:51 +00:00
if y == -1:
2024-02-01 20:15:33 +00:00
self.context.translate(0, (self.height - pango.units_to_double(layout.get_size()[1]))/2)
2015-08-29 22:46:51 +00:00
self.context.set_source_rgb(0, 0, 0)
2024-02-01 20:15:33 +00:00
pangocairo.update_layout(self.context, layout)
pangocairo.show_layout(self.context, layout)
2015-08-29 22:46:51 +00:00
self.context.restore()
@app.route('/')
def index():
return flask.render_template('index.html')
2024-02-01 20:15:33 +00:00
@app.route('/api/preview/<int:size>/')
2015-08-29 22:46:51 +00:00
def stuff_preview(size):
text = flask.request.args.get('text')
html = flask.request.args.get('html') == '1'
renderer = Renderer()
renderer.render_text(text, 'Sans {}'.format(size), 0, -1, html)
2015-08-29 22:46:51 +00:00
preview = renderer.surface.write_to_png()
2024-02-01 20:15:33 +00:00
return flask.Response(preview, mimetype='image/png')
2015-08-29 22:46:51 +00:00
DELAY = 5
2024-02-01 20:15:33 +00:00
@app.route('/api/print/<int:size>/', methods=['POST'])
2015-08-29 22:46:51 +00:00
def stuff_print(size):
text = flask.request.args.get('text')
html = flask.request.args.get('html') == '1'
renderer = Renderer()
renderer.render_text(text, 'Sans {}'.format(size), 0, -1, html)
2024-02-07 13:17:29 +00:00
data = renderer.surface.write_to_png()
2024-02-07 16:47:58 +00:00
response = requests.post(
os.environ.get('PRINTSERVANT_HOST') + '/print',
params={'printer': 'dymo', 'copies': 1},
data=data,
headers={'Content-Type': 'image/png'},
)
print('Printing job response', response)
2024-02-07 16:48:12 +00:00
if response.status_code != 200:
return flask.Response(f"{response.text} ({response.status_code})", status=response.status_code)
2015-08-29 22:46:51 +00:00
return 'ok'
2024-02-01 20:15:33 +00:00
def main():
app.run(host="0.0.0.0", port=5000, debug=True)
2015-08-29 22:46:51 +00:00
if __name__ == '__main__':
2024-02-01 20:15:33 +00:00
main()