diff --git a/barcode_helpers.py b/barcode_helpers.py new file mode 100644 index 0000000..98f9265 --- /dev/null +++ b/barcode_helpers.py @@ -0,0 +1,62 @@ +from PIL import ImageFont +from barcode.writer import ImageWriter, mm2px +from brother_ql.devicedependent import label_type_specs + + +def px2mm(px, dpi=300): + return (25.4 * px)/dpi + + +class BrotherLabelWriter(ImageWriter): + def __init__(self, typ='62', max_height=350, rot=0, text=None): + super().__init__() + assert typ in label_type_specs + if (rot//90) % 2 == 1: + self._h, self._w = label_type_specs[typ]['dots_printable'] + if self._w == 0 or self._w > max_height: + self._w = max_height + if (rot//90) % 2 == 0: + self._w, self._h = label_type_specs[typ]['dots_printable'] + if self._h == 0 or self._h > max_height: + self._h = max_height + self._xo = 0.0 + self._yo = 0.0 + self._title = text + + def _init(self, code): + self.text = None + super()._init(code) + + def calculate_size(self, modules_per_line, number_of_lines, dpi=300): + x, y = super().calculate_size(modules_per_line, number_of_lines, dpi) + + self._xo = (px2mm(self._w)-px2mm(x))/2 + self._yo = (px2mm(self._h)-px2mm(y)) + assert self._xo >= 0 + assert self._yo >= 0 + + return int(self._w), int(self._h) + + def _paint_module(self, xpos, ypos, width, color): + super()._paint_module(xpos+self._xo, ypos+self._yo, width, color) + + def _paint_text(self, xpos, ypos): + super()._paint_text(xpos+self._xo, ypos+self._yo) + + def _finish(self): + if self._title: + width = self._w+1 + height = 0 + max_h = self._h - mm2px(self._yo, self.dpi) + fs = int(max_h / 1.2) + font = ImageFont.truetype("arial.ttf", 10) + while width > self._w or height > max_h: + font = ImageFont.truetype("Stranger back in the Night.ttf", fs) + width, height = font.getsize(self._title) + fs -= 1 + pos = ( + (self._w-width)//2, + mm2px(0, self.dpi) + ) + self._draw.text(pos, self._title, font=font, fill=self.foreground) + return self._image diff --git a/printer_helpers.py b/printer_helpers.py new file mode 100644 index 0000000..96a4abb --- /dev/null +++ b/printer_helpers.py @@ -0,0 +1,34 @@ +import barcode +from brother_ql import BrotherQLRaster +from brother_ql import create_label +from brother_ql.backends import backend_factory + +from barcode_helpers import BrotherLabelWriter + + +def print_bar_code(barcode_value, barcode_text, barcode_type="ean13", rotate=False, printer_type="QL-700", + label_type="62"): + bar_coder = barcode.get_barcode_class(barcode_type) + wr = BrotherLabelWriter(typ=label_type, rot=rotate*90, text=barcode_text, max_height=1000) + + test = bar_coder(barcode_value, writer=wr) + fn = test.save(barcode_value) + print_image(fn, printer_type, label_type, rotate*90) + + +def print_image(fn, printer_type="QL-700", label_type="62", rotate=0): + qlr = BrotherQLRaster(printer_type) + qlr.exception_on_warning = True + create_label(qlr, fn, label_type, threshold=70, cut=True, rotate=rotate) + + be = backend_factory("pyusb") + list_available_devices = be['list_available_devices'] + BrotherQLBackend = be['backend_class'] + + ad = list_available_devices() + assert ad + string_descr = ad[0]['string_descr'] + + printer = BrotherQLBackend(string_descr) + + printer.write(qlr.data) \ No newline at end of file