mirror of
https://github.com/pklaus/brother_ql_web.git
synced 2024-05-25 11:56:53 +03:00
Added support for multiple printers
Fixed runtime errors (on osx)
This commit is contained in:
parent
0a2cf12c39
commit
9962289dd1
|
@ -1,4 +1,5 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
This is a web service to print labels on Brother QL label printers.
|
This is a web service to print labels on Brother QL label printers.
|
||||||
|
@ -21,6 +22,8 @@ logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
LABEL_SIZES = [ (name, label_type_specs[name]['name']) for name in label_sizes]
|
LABEL_SIZES = [ (name, label_type_specs[name]['name']) for name in label_sizes]
|
||||||
|
|
||||||
|
PRINTERS = {}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with open('config.json') as fh:
|
with open('config.json') as fh:
|
||||||
CONFIG = json.load(fh)
|
CONFIG = json.load(fh)
|
||||||
|
@ -45,7 +48,8 @@ def labeldesigner():
|
||||||
'fonts': FONTS,
|
'fonts': FONTS,
|
||||||
'label_sizes': LABEL_SIZES,
|
'label_sizes': LABEL_SIZES,
|
||||||
'website': CONFIG['WEBSITE'],
|
'website': CONFIG['WEBSITE'],
|
||||||
'label': CONFIG['LABEL']}
|
'label': CONFIG['LABEL'],
|
||||||
|
'printers': PRINTERS }
|
||||||
|
|
||||||
def get_label_context(request):
|
def get_label_context(request):
|
||||||
""" might raise LookupError() """
|
""" might raise LookupError() """
|
||||||
|
@ -69,6 +73,7 @@ def get_label_context(request):
|
||||||
'margin_bottom': float(d.get('margin_bottom', 45))/100.,
|
'margin_bottom': float(d.get('margin_bottom', 45))/100.,
|
||||||
'margin_left': float(d.get('margin_left', 35))/100.,
|
'margin_left': float(d.get('margin_left', 35))/100.,
|
||||||
'margin_right': float(d.get('margin_right', 35))/100.,
|
'margin_right': float(d.get('margin_right', 35))/100.,
|
||||||
|
'printer_name': d.get('printer_name', None),
|
||||||
}
|
}
|
||||||
context['margin_top'] = int(context['font_size']*context['margin_top'])
|
context['margin_top'] = int(context['font_size']*context['margin_top'])
|
||||||
context['margin_bottom'] = int(context['font_size']*context['margin_bottom'])
|
context['margin_bottom'] = int(context['font_size']*context['margin_bottom'])
|
||||||
|
@ -179,11 +184,15 @@ def print_text():
|
||||||
try:
|
try:
|
||||||
context = get_label_context(request)
|
context = get_label_context(request)
|
||||||
except LookupError as e:
|
except LookupError as e:
|
||||||
return_dict['error'] = e.msg
|
return_dict['message'] = e.msg
|
||||||
return return_dict
|
return return_dict
|
||||||
|
|
||||||
if context['text'] is None:
|
if not context['text'] or context['text'] is None:
|
||||||
return_dict['error'] = 'Please provide the text for the label'
|
return_dict['message'] = 'Please provide the text for the label'
|
||||||
|
return return_dict
|
||||||
|
|
||||||
|
if not context['printer_name'] or context['printer_name'] is None:
|
||||||
|
return_dict['message'] = 'Please select a printer'
|
||||||
return return_dict
|
return return_dict
|
||||||
|
|
||||||
im = create_label_im(**context)
|
im = create_label_im(**context)
|
||||||
|
@ -194,12 +203,20 @@ def print_text():
|
||||||
elif context['kind'] in (ROUND_DIE_CUT_LABEL, DIE_CUT_LABEL):
|
elif context['kind'] in (ROUND_DIE_CUT_LABEL, DIE_CUT_LABEL):
|
||||||
rotate = 'auto'
|
rotate = 'auto'
|
||||||
|
|
||||||
qlr = BrotherQLRaster(CONFIG['PRINTER']['MODEL'])
|
qlr = BrotherQLRaster(PRINTERS[context['printer_name']]["MODEL"])
|
||||||
create_label(qlr, im, context['label_size'], threshold=context['threshold'], cut=True, rotate=rotate)
|
create_label(qlr, im, context['label_size'], threshold=context['threshold'], cut=True, rotate=rotate)
|
||||||
|
|
||||||
|
try:
|
||||||
|
selected_backend = guess_backend(PRINTERS[context['printer_name']]["LOCATION"])
|
||||||
|
except Exception as e:
|
||||||
|
return_dict['message'] = str(e)
|
||||||
|
return return_dict
|
||||||
|
|
||||||
|
BACKEND_CLASS = backend_factory(selected_backend)['backend_class']
|
||||||
|
|
||||||
if not DEBUG:
|
if not DEBUG:
|
||||||
try:
|
try:
|
||||||
be = BACKEND_CLASS(CONFIG['PRINTER']['PRINTER'])
|
be = BACKEND_CLASS(PRINTERS[context['printer_name']]["LOCATION"])
|
||||||
be.write(qlr.data)
|
be.write(qlr.data)
|
||||||
be.dispose()
|
be.dispose()
|
||||||
del be
|
del be
|
||||||
|
@ -219,13 +236,13 @@ def main():
|
||||||
parser.add_argument('--loglevel', type=lambda x: getattr(logging, x.upper()), default=False)
|
parser.add_argument('--loglevel', type=lambda x: getattr(logging, x.upper()), default=False)
|
||||||
parser.add_argument('--font-folder', default=False, help='folder for additional .ttf/.otf fonts')
|
parser.add_argument('--font-folder', default=False, help='folder for additional .ttf/.otf fonts')
|
||||||
parser.add_argument('--default-label-size', default=False, help='Label size inserted in your printer. Defaults to 62.')
|
parser.add_argument('--default-label-size', default=False, help='Label size inserted in your printer. Defaults to 62.')
|
||||||
parser.add_argument('--default-orientation', default=False, choices=('standard', 'rotated'), help='Label orientation, defaults to "standard". To turn your text by 90°, state "rotated".')
|
parser.add_argument('--default-orientation', default=False, choices=('standard', 'rotated'), help='Label orientation, defaults to "standard". To turn your text by 90 degrees, state "rotated".')
|
||||||
parser.add_argument('--model', default=False, choices=models, help='The model of your printer (default: QL-500)')
|
parser.add_argument('--model', default=False, choices=models, help='The model of your printer (default: QL-500)')
|
||||||
parser.add_argument('printer', nargs='?', default=False, help='String descriptor for the printer to use (like tcp://192.168.0.23:9100 or file:///dev/usb/lp0)')
|
parser.add_argument('printer', nargs='?', default=False, help='String descriptor for the printer to use (like tcp://192.168.0.23:9100 or file:///dev/usb/lp0)')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
if args.printer:
|
if args.printer:
|
||||||
CONFIG['PRINTER']['PRINTER'] = args.printer
|
CONFIG['PRINTERS']['PRINTER'] = args.printer
|
||||||
|
|
||||||
if args.port:
|
if args.port:
|
||||||
PORT = args.port
|
PORT = args.port
|
||||||
|
@ -243,7 +260,7 @@ def main():
|
||||||
DEBUG = False
|
DEBUG = False
|
||||||
|
|
||||||
if args.model:
|
if args.model:
|
||||||
CONFIG['PRINTER']['MODEL'] = args.model
|
CONFIG['PRINTERS']['MODEL'] = args.model
|
||||||
|
|
||||||
if args.default_label_size:
|
if args.default_label_size:
|
||||||
CONFIG['LABEL']['DEFAULT_SIZE'] = args.default_label_size
|
CONFIG['LABEL']['DEFAULT_SIZE'] = args.default_label_size
|
||||||
|
@ -259,12 +276,6 @@ def main():
|
||||||
|
|
||||||
logging.basicConfig(level=LOGLEVEL)
|
logging.basicConfig(level=LOGLEVEL)
|
||||||
|
|
||||||
try:
|
|
||||||
selected_backend = guess_backend(CONFIG['PRINTER']['PRINTER'])
|
|
||||||
except ValueError:
|
|
||||||
parser.error("Couln't guess the backend to use from the printer string descriptor")
|
|
||||||
BACKEND_CLASS = backend_factory(selected_backend)['backend_class']
|
|
||||||
|
|
||||||
if CONFIG['LABEL']['DEFAULT_SIZE'] not in label_sizes:
|
if CONFIG['LABEL']['DEFAULT_SIZE'] not in label_sizes:
|
||||||
parser.error("Invalid --default-label-size. Please choose on of the following:\n:" + " ".join(label_sizes))
|
parser.error("Invalid --default-label-size. Please choose on of the following:\n:" + " ".join(label_sizes))
|
||||||
|
|
||||||
|
@ -290,6 +301,9 @@ def main():
|
||||||
CONFIG['LABEL']['DEFAULT_FONTS'] = {'family': family, 'style': style}
|
CONFIG['LABEL']['DEFAULT_FONTS'] = {'family': family, 'style': style}
|
||||||
sys.stderr.write('The default font is now set to: {family} ({style})\n'.format(**CONFIG['LABEL']['DEFAULT_FONTS']))
|
sys.stderr.write('The default font is now set to: {family} ({style})\n'.format(**CONFIG['LABEL']['DEFAULT_FONTS']))
|
||||||
|
|
||||||
|
for printer in CONFIG['PRINTERS']:
|
||||||
|
PRINTERS[printer["NAME"]] = printer
|
||||||
|
|
||||||
run(host=CONFIG['SERVER']['HOST'], port=PORT, debug=DEBUG)
|
run(host=CONFIG['SERVER']['HOST'], port=PORT, debug=DEBUG)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
@ -5,10 +5,13 @@
|
||||||
"LOGLEVEL": "WARNING",
|
"LOGLEVEL": "WARNING",
|
||||||
"ADDITIONAL_FONT_FOLDER": false
|
"ADDITIONAL_FONT_FOLDER": false
|
||||||
},
|
},
|
||||||
"PRINTER": {
|
"PRINTERS": [
|
||||||
"MODEL": "QL-500",
|
{
|
||||||
"PRINTER": "file:///dev/usb/lp1"
|
"NAME": "Labelprinter",
|
||||||
},
|
"MODEL": "QL-500",
|
||||||
|
"LOCATION": "file:///dev/usb/lp1"
|
||||||
|
}
|
||||||
|
],
|
||||||
"LABEL": {
|
"LABEL": {
|
||||||
"DEFAULT_SIZE": "62",
|
"DEFAULT_SIZE": "62",
|
||||||
"DEFAULT_ORIENTATION": "standard",
|
"DEFAULT_ORIENTATION": "standard",
|
||||||
|
|
|
@ -20,6 +20,7 @@ def get_fonts(folder=None):
|
||||||
if not line: continue
|
if not line: continue
|
||||||
if 'otf' not in line and 'ttf' not in line: continue
|
if 'otf' not in line and 'ttf' not in line: continue
|
||||||
parts = line.split(':')
|
parts = line.split(':')
|
||||||
|
if len(parts) < 3: continue
|
||||||
path = parts[0]
|
path = parts[0]
|
||||||
families = parts[1].strip().split(',')
|
families = parts[1].strip().split(',')
|
||||||
styles = parts[2].split('=')[1].split(',')
|
styles = parts[2].split('=')[1].split(',')
|
||||||
|
|
|
@ -116,6 +116,18 @@
|
||||||
<label for="previewImg">Label Preview:</label><br />
|
<label for="previewImg">Label Preview:</label><br />
|
||||||
<img id="previewImg" style="border: 1px solid #444; max-height: 350px; width: auto; max-width: 100%; margin-bottom: 10px;"/>
|
<img id="previewImg" style="border: 1px solid #444; max-height: 350px; width: auto; max-width: 100%; margin-bottom: 10px;"/>
|
||||||
<p>Printed size w/o margins: <span id="labelWidth">?</span> cm x <span id="labelHeight">?</span> cm</p>
|
<p>Printed size w/o margins: <span id="labelWidth">?</span> cm x <span id="labelHeight">?</span> cm</p>
|
||||||
|
|
||||||
|
<div {% if printers|length == 1 %} hidden {% endif %}>
|
||||||
|
<label for="printer">Printer:</label>
|
||||||
|
<select class="form-control" id="printer">
|
||||||
|
<option value="" disabled {% if printers|length > 1 %} selected {% endif %} > -- select a printer -- </option>
|
||||||
|
{% for printer in printers %}
|
||||||
|
<option value="{{printer}}" {% if printers|length == 1 %} selected {% endif %} >{{printer}}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
<br/>
|
||||||
|
</div>
|
||||||
|
|
||||||
<button id="printButton" type="button" class="btn btn-primary btn-block btn-lg" onClick="print()">
|
<button id="printButton" type="button" class="btn btn-primary btn-block btn-lg" onClick="print()">
|
||||||
<span class="glyphicon glyphicon-print" aria-hidden="true"></span> Print
|
<span class="glyphicon glyphicon-print" aria-hidden="true"></span> Print
|
||||||
</button>
|
</button>
|
||||||
|
@ -136,9 +148,8 @@
|
||||||
var text = $('#labelText');
|
var text = $('#labelText');
|
||||||
|
|
||||||
function formData() {
|
function formData() {
|
||||||
//var text = $('#labelText').val().replace(/\n/g, "%0A");
|
|
||||||
var text = $('#labelText').val();
|
var text = $('#labelText').val();
|
||||||
if (text == '') text = ' ';
|
|
||||||
return {
|
return {
|
||||||
text: text,
|
text: text,
|
||||||
font_family: $('#fontFamily option:selected').text(),
|
font_family: $('#fontFamily option:selected').text(),
|
||||||
|
@ -149,7 +160,8 @@ function formData() {
|
||||||
margin_top: $('#marginTop').val(),
|
margin_top: $('#marginTop').val(),
|
||||||
margin_bottom: $('#marginBottom').val(),
|
margin_bottom: $('#marginBottom').val(),
|
||||||
margin_left: $('#marginLeft').val(),
|
margin_left: $('#marginLeft').val(),
|
||||||
margin_right: $('#marginRight').val()
|
margin_right: $('#marginRight').val(),
|
||||||
|
printer_name: $('#printer option:selected').val()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user