From 9f17cf2b52684efd023a37225d50b996c5a47002 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergiusz=20=27q3k=27=20Baza=C5=84ski?= Date: Sun, 30 Aug 2015 00:46:51 +0200 Subject: [PATCH] Initial commit. --- README.md | 1 + render.py | 109 ++++++++++++++++++++++++++++++++++++++ templates/.index.html.swp | Bin 0 -> 16384 bytes templates/index.html | 97 +++++++++++++++++++++++++++++++++ 4 files changed, 207 insertions(+) create mode 100644 README.md create mode 100644 render.py create mode 100644 templates/.index.html.swp create mode 100644 templates/index.html diff --git a/README.md b/README.md new file mode 100644 index 0000000..ecac4a5 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +Use the source, luke :^) diff --git a/render.py b/render.py new file mode 100644 index 0000000..3a3b555 --- /dev/null +++ b/render.py @@ -0,0 +1,109 @@ +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) diff --git a/templates/.index.html.swp b/templates/.index.html.swp new file mode 100644 index 0000000000000000000000000000000000000000..0721da1c9e915186a2d6f3d97d1de254d4d84f71 GIT binary patch literal 16384 zcmeHNON`t|87=~ZWg%>|2qYxX);LkRXGz=L(;-~sw>{%m z?DF(9VRp|Tae(V01e`c<$YsR^32{MMX-^1=-3vk>ffgi$R)Px$_^NDod%AlbSs?*Z zS^C=Ta@GI%T=iF#e-GMUzI}&YF)tAuX9?+C{{6kR(bJ^;fROv$9a(zp5&51U_*r;d z#g`z^3fO=LA=}}pC3u(wOz_O|BbV=)o(O~EWa#^v0nNZWU?3O6)-z{FcdgTwtGy|Fe&46a$|CIreoFXs7_*10=H_P+8=FaafuRmU% zpPjp3Uh0!(Kr^5j&Gy|Fe&46Y=GoTsJ3}^;41OI~zFqaUyx9`dgKl1<8{{L@J z5b_rATj1xw%fOSsY2cq9BILWk4sZ=P3p_YO$O>>8c=LmVd=0n>d=&Wc2MFl{PXUhs ze}9~iKLWo5egJ$0xB>j>{e-**{0P_w{`wdpzX2Ws-vYi0d;<9C`w00S5CbjXXQv7I zA@KHl33(3a0FMK2y@!xj0T1{ha0>VfoP7g$4cG@h27DhcKfVn_z%Ae`@GJ1~5-mepMBpZyM(YB1%%e>+`X(YC3`M>@-I_;we6K*euFd zi^}`ONs5#0W{sE-Y17D3$GAuhD--!}Xq9&@gMN|@<49!w*E#+g)-}QRL{ApWKc#3X zQ<^A?U?Gp3*yZ=Wbo+W7CUL|g(Ucn1rx>yd4Bcfxb9JuuR8Nm4EY0}svRzd^*Gwv$ z^Hj2vM~?90sJTiXkn>G9cJdGgtePoj?xcC(wlrHFcIKphBKkyK%?cCvZOUi<8feh%(mIKw(sXWotSes&Crj` z?ab)g)`?VyY!BLJQsjlyJ{4~hA3HN zzP`M+y-WR#&D*wx^Fjq1JW?lMS=KY0IB11#>x!|Y+H!K0_(3j298obzc+V&<4C=f1 zFJlAVGgoe+2VURcRDV63=%aar&=SieahGTAuH^Jn9)D&AIBz zXxpcoQqhWS75Wz)IDw@_G^@<0Y<2mN<$-tvTYX35DL3em)+%Mkn0q+q${RmQa-oQx zg*e2+Ajf0aV)*Ec)4MY4(M(JNl#P8?csqv`ZP*co?mXyJKQ*U)%2eQRdfsU(tprf49qPq1cpR*;!)aNLfs)DP&#M(;YjtBGE#sfIm=8#T@i|| zRKd>86E@{>5T`CrTV?<0p!d+SNcF6Bn#F%zg8By>9=r@g8l&bW5%+XwgsYEM!4|r__m(XlT)iuor* z*x~ncKasOHrb$&97IqK1aR|}2*Xchun@WnHBm>>nB*SN*RBBa$N|q^mf+9 z)>h|MwQOPD7YFFA({Ko{RTVqw-}QJ_E)O#FuuM?&F+MTrjW}vxTHzE^AEsX~4){g< zcWE32lX7LDR>fFfFvR(cVl5fqR>Zl>T@x#jgB@q8wAO(N7Y4Bl!bw%3em>3t?@~1( z7NUeN0!+IbDW{V-rx|8C^=HiFLTI)k^0RBp2X>|W$VZChZiX3j*@G;mRW<+gjO(gi zxqetO-(C=Y$g`^$$a0bJs84=j;7x5`U|0@AM2tC-7dw;dvmnNbha4&j8!Z>E%k@(@ zxug0n6>Ols9q$>fjzKX|V>T}()#wPgJD5ycsqj)NvSkM-bmE~PoYeFOezb$074!@h z%rlR3EE&9%4`+LjlWqi@Y_k9{i_3%6|f zb$y@MD>uGy{qBpKH?h>0*K+^=8SK$t2ju?0%J2UH`~05(5%3i7FYNIj0ngFcUuL=HQdP|=D_2W`sh8{34Jk!t z&8ofUs;Tz<%?4h(^G2;zl^2w+;SZz*s~102T5uuvRhcGL?GyQ19SfH1Q;w`7QfgHV zd0uKB-k*%?=J`X~Tv0a4j9k?WuZon8Y0h%dxLLZgZl@G*&{idKmK(bzvv1AD23{Yg zDPHp-0hp%TU8fD?EaiKQi}XQ5rbrqnD)S$W1r5vGU9M&2q=#*)Ye8p_N8m zM{y%t&>@MD_RwCB8u5-%(Nm~N@Pev2dn*hb$K_%#&T^kpY+c-cB{!>{?|eq~-{|9T A&Hw-a literal 0 HcmV?d00001 diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..0772f57 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,97 @@ + + + + + Hackerspace Printing System For Printing + + + + +
+ +

Box 'o Stuff Label For SAMLA boxes with common equipment

+
+
+

Preview

+
+
+
+

Settings

+
+ + +
+
+ + +
+ + +
+
+

API

+
$ # To get a label preview
+$ curl http://label.waw.hackerspace.pl/stuff/preview/60/?text=foobar | feh -
+$ # To print the label
+$ curl -d "" http://label.waw.hackerspace.pl/stuff/print/60/?text=foobar
+
+
+
+ + + + + +