Add new printing options, change image conversion for Brother QL
printers
This commit is contained in:
40
src/main.py
40
src/main.py
@@ -173,9 +173,13 @@ def web_print_sms():
|
|||||||
"No signature found for this print, using default signature : %s ", str(e)
|
"No signature found for this print, using default signature : %s ", str(e)
|
||||||
)
|
)
|
||||||
sign = configuration_file["defaults"]["signature"]
|
sign = configuration_file["defaults"]["signature"]
|
||||||
|
try:
|
||||||
|
do_cut = bool(request.form["cut"])
|
||||||
|
except werkzeug.exceptions.BadRequestKeyError:
|
||||||
|
do_cut = False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
web.print_sms(txt, sign)
|
web.print_sms(txt, sign, do_cut)
|
||||||
except RuntimeError as e:
|
except RuntimeError as e:
|
||||||
app.logger.error("Whoops, we could not print an SMS because : %s ", str(e))
|
app.logger.error("Whoops, we could not print an SMS because : %s ", str(e))
|
||||||
flash("Whoops, we could not print an SMS because :" + str(e), "error")
|
flash("Whoops, we could not print an SMS because :" + str(e), "error")
|
||||||
@@ -219,9 +223,20 @@ def web_print_img():
|
|||||||
flash("Submitted file has no filename !", "error")
|
flash("Submitted file has no filename !", "error")
|
||||||
return redirect(url_for("index"))
|
return redirect(url_for("index"))
|
||||||
|
|
||||||
|
try:
|
||||||
|
do_cut = bool(request.form["cut"])
|
||||||
|
except werkzeug.exceptions.BadRequestKeyError:
|
||||||
|
do_cut = False
|
||||||
|
|
||||||
|
try:
|
||||||
|
process_image = bool(request.form["process"])
|
||||||
|
except werkzeug.exceptions.BadRequestKeyError:
|
||||||
|
process_image = False
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
app.logger.debug("Sending the image to the printer.")
|
app.logger.debug("Sending the image to the printer.")
|
||||||
web.print_image(file, sign)
|
web.print_image(file, sign, do_cut, process_image)
|
||||||
except RuntimeError as e:
|
except RuntimeError as e:
|
||||||
app.logger.error("The image could not be printed because : %s ", str(e))
|
app.logger.error("The image could not be printed because : %s ", str(e))
|
||||||
flash("The image could not be printed because : " + str(e), "error")
|
flash("The image could not be printed because : " + str(e), "error")
|
||||||
@@ -266,9 +281,16 @@ def api_print_sms():
|
|||||||
"No signature found for this print, using default signature. : %s", str(e)
|
"No signature found for this print, using default signature. : %s", str(e)
|
||||||
)
|
)
|
||||||
sign = configuration_file["defaults"]["signature"]
|
sign = configuration_file["defaults"]["signature"]
|
||||||
|
|
||||||
|
try:
|
||||||
|
do_cut = bool(request.form["cut"])
|
||||||
|
except werkzeug.exceptions.BadRequestKeyError:
|
||||||
|
do_cut = False
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# comment: We try to print the SMS
|
# comment: We try to print the SMS
|
||||||
web.print_sms(txt, sign)
|
web.print_sms(txt, sign, do_cut)
|
||||||
except RuntimeError as e:
|
except RuntimeError as e:
|
||||||
return str(e), 500
|
return str(e), 500
|
||||||
# end try
|
# end try
|
||||||
@@ -301,9 +323,19 @@ def api_print_image():
|
|||||||
app.logger.error("Submitted file has no filename !")
|
app.logger.error("Submitted file has no filename !")
|
||||||
return "Submitted file has no filename !", 400
|
return "Submitted file has no filename !", 400
|
||||||
|
|
||||||
|
try:
|
||||||
|
do_cut = bool(request.form["cut"])
|
||||||
|
except werkzeug.exceptions.BadRequestKeyError:
|
||||||
|
do_cut = False
|
||||||
|
|
||||||
|
try:
|
||||||
|
process_image = bool(request.form["process"])
|
||||||
|
except werkzeug.exceptions.BadRequestKeyError:
|
||||||
|
process_image = False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
app.logger.debug("Sending the image to the printer.")
|
app.logger.debug("Sending the image to the printer.")
|
||||||
web.print_image(file, sign)
|
web.print_image(file, sign, do_cut, process_image)
|
||||||
except RuntimeError as e:
|
except RuntimeError as e:
|
||||||
return str(e), 500
|
return str(e), 500
|
||||||
|
|
||||||
|
|||||||
@@ -460,22 +460,35 @@ class BrotherPrinter(Printer):
|
|||||||
"""Print text after converting it to an image"""
|
"""Print text after converting it to an image"""
|
||||||
self._print_img(text_to_image(msg))
|
self._print_img(text_to_image(msg))
|
||||||
|
|
||||||
def _print_img(self, data):
|
def _print_img(self, data, process=False):
|
||||||
"""
|
"""
|
||||||
Print a raster image via a Brother QL printer
|
Print a raster image via a Brother QL printer
|
||||||
"""
|
"""
|
||||||
self.ready = False
|
self.ready = False
|
||||||
|
|
||||||
|
if process:
|
||||||
|
try:
|
||||||
|
self.app.logger.debug("Proccessing the image")
|
||||||
|
processed_path = _process_image(self, data)
|
||||||
|
except RuntimeError as e:
|
||||||
|
self.app.logger.error(
|
||||||
|
"Error while processing the image, aborting print : %s", str(e)
|
||||||
|
)
|
||||||
|
raise e
|
||||||
|
else:
|
||||||
|
processed_path = data
|
||||||
|
self.app.logger.warning("Not proccessing the image")
|
||||||
try:
|
try:
|
||||||
selected_backend = guess_backend(self.printer_info.identifier)
|
selected_backend = guess_backend(self.printer_info.identifier)
|
||||||
BACKEND_CLASS = backend_factory(selected_backend)['backend_class']
|
BACKEND_CLASS = backend_factory(selected_backend)['backend_class']
|
||||||
BACKEND_STRING_DESCR = self.printer_info.identifier
|
BACKEND_STRING_DESCR = self.printer_info.identifier
|
||||||
except Exception as e:
|
except Exception:
|
||||||
self.app.logger.error("Couldn't guess the backend to use from the printer string descriptor")
|
self.app.logger.error("Couldn't guess the backend to use from the printer string descriptor")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
im = Image.open(data)
|
im = Image.open(processed_path)
|
||||||
qlr = BrotherQLRaster(self.printer_info.model)
|
qlr = BrotherQLRaster(self.printer_info.model)
|
||||||
create_label(qlr, im, self.printer_info.label_type, threshold=70, cut=False, rotate=0)
|
create_label(qlr, im, self.printer_info.label_type, cut=False, dither=True)
|
||||||
|
|
||||||
# noinspection PyCallingNonCallable
|
# noinspection PyCallingNonCallable
|
||||||
be = BACKEND_CLASS(BACKEND_STRING_DESCR)
|
be = BACKEND_CLASS(BACKEND_STRING_DESCR)
|
||||||
|
|||||||
BIN
src/static/images/1x1.png
Normal file
BIN
src/static/images/1x1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 153 B |
BIN
src/static/images/calibration.png
Normal file
BIN
src/static/images/calibration.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.2 KiB |
@@ -6,13 +6,13 @@
|
|||||||
<h3 class="card-header">Print a short message</h3>
|
<h3 class="card-header">Print a short message</h3>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<form class="form-group" action="/web/print/sms" method="post">
|
<form class="form-group" action="/web/print/sms" method="post">
|
||||||
<textarea class="form-control" type="text" name="txt" placeholder="4096 chars or less " maxlength="4096"></textarea>
|
<textarea class="form-control" type="text" name="txt" placeholder="4096 caractères maximum " maxlength="4096"></textarea>
|
||||||
<br>
|
<br>
|
||||||
<input class="form-control" type="text" name="signature" placeholder="Signature or pseudo" maxlength="200"><br>
|
<input class="form-control" type="text" name="signature" placeholder="Signature ou pseudo" maxlength="200"><br>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="checkbox" value="cut" id="flexCheckDefault">
|
<input class="form-check-input" type="checkbox" value="True" id="flexCheckDefault" name="cut" checked>
|
||||||
<label class="form-check-label" for="flexCheckDefault">
|
<label class="form-check-label" for="flexCheckDefault">
|
||||||
Cut after print ?
|
Couper après impression ?
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<br>
|
<br>
|
||||||
@@ -28,11 +28,17 @@
|
|||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<form enctype="multipart/form-data" class="form-group" action="/web/print/img" method="post">
|
<form enctype="multipart/form-data" class="form-group" action="/web/print/img" method="post">
|
||||||
<input class="form-control" type="file" name="img" required><br>
|
<input class="form-control" type="file" name="img" required><br>
|
||||||
<input class="form-control" type="text" name="signature" placeholder="Signature or pseudo" maxlength="200"><br>
|
<input class="form-control" type="text" name="signature" placeholder="Signature ou pseudo" maxlength="200"><br>
|
||||||
<div class="form-check">
|
<div class="form-check .form-check-inline">
|
||||||
<input class="form-check-input" type="checkbox" value="cut" id="flexCheckDefault">
|
<input class="form-check-input" type="checkbox" value="True" id="flexCheckDefault" name="cut" checked>
|
||||||
<label class="form-check-label" for="flexCheckDefault">
|
<label class="form-check-label" for="flexCheckDefault">
|
||||||
Cut after print ?
|
Couper après impression ?
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check .form-check-inline">
|
||||||
|
<input class="form-check-input" type="checkbox" value="True" id="flexCheckDefault" name="process">
|
||||||
|
<label class="form-check-label" for="flexCheckDefault">
|
||||||
|
Traiter l'image ?
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<br>
|
<br>
|
||||||
|
|||||||
17
src/web.py
17
src/web.py
@@ -16,7 +16,7 @@ class Web:
|
|||||||
self.print_queue = print_queue
|
self.print_queue = print_queue
|
||||||
self.app = app
|
self.app = app
|
||||||
|
|
||||||
def print_sms(self, texte, sign: str) -> bool:
|
def print_sms(self, texte, sign: str, do_cut: bool) -> bool:
|
||||||
"""
|
"""
|
||||||
Get text and a signature, prints the text and cuts after that.
|
Get text and a signature, prints the text and cuts after that.
|
||||||
"""
|
"""
|
||||||
@@ -29,14 +29,18 @@ class Web:
|
|||||||
# are added back to back, another task could be
|
# are added back to back, another task could be
|
||||||
# inserted between the two.
|
# inserted between the two.
|
||||||
sms = self.print_queue.enqueue(TextTask(content=texte, signature=sign))
|
sms = self.print_queue.enqueue(TextTask(content=texte, signature=sign))
|
||||||
|
self.app.logger.info("Added a SMS task at position %s", sms)
|
||||||
|
|
||||||
|
if do_cut:
|
||||||
cut = self.print_queue.enqueue(CutTask())
|
cut = self.print_queue.enqueue(CutTask())
|
||||||
|
self.app.logger.info("Added a CUT task at position %s", cut)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.app.logger.error(e)
|
self.app.logger.error(e)
|
||||||
raise RuntimeError("Could not add SMS to queue, " + str(e)) from e
|
raise RuntimeError("Could not add SMS to queue, " + str(e)) from e
|
||||||
self.app.logger.info("Added two new tasks at position %s and %s", sms, cut)
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def print_image(self, image, sign: str) -> bool:
|
def print_image(self, image, sign: str, do_cut: bool, process_image: bool) -> bool:
|
||||||
"""
|
"""
|
||||||
Get an image and a signature, prints the image and cuts after that.
|
Get an image and a signature, prints the image and cuts after that.
|
||||||
"""
|
"""
|
||||||
@@ -56,16 +60,17 @@ class Web:
|
|||||||
secure_filename(image.filename),
|
secure_filename(image.filename),
|
||||||
),
|
),
|
||||||
signature=sign,
|
signature=sign,
|
||||||
process=True,
|
process=process_image,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
self.app.logger.info("Added a IMG task at position %s", img)
|
||||||
|
|
||||||
|
if do_cut:
|
||||||
cut = self.print_queue.enqueue(CutTask())
|
cut = self.print_queue.enqueue(CutTask())
|
||||||
|
self.app.logger.info("Added a CUT task at position %s", cut)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise RuntimeError("Could not add IMG to queue" + str(e)) from e
|
raise RuntimeError("Could not add IMG to queue" + str(e)) from e
|
||||||
|
|
||||||
self.app.logger.info("Added two new tasks at position %s and %s", img, cut)
|
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
# def login(self, username: str, password: str) -> bool:
|
# def login(self, username: str, password: str) -> bool:
|
||||||
|
|||||||
Reference in New Issue
Block a user