import logging import os import win32print import win32ui from PIL import Image, ImageDraw, ImageFont, ImageOps, ImageWin import qrcode from .component import Component class BrotherLabelPrinter(Component): def __int__(self): self.log = logging.getLogger() def print_label(self, barcode): printer_name = win32print.GetDefaultPrinter() file_name = "./tmp/tmp.png" qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4, ) qr.add_data(barcode) qr.make(fit=True) try: barcode_img = qr.make_image(fill_color="black", back_color="white") barcode_img = barcode_img.resize((250, 250)) print_width = 720 print_height = 380 label_img = Image.new("RGB", (print_width, print_height), color=(255, 255, 255)) label_img.paste(barcode_img, box=(20, 20)) draw = ImageDraw.Draw(label_img) font = ImageFont.truetype("config/label_templates/Fonts/FreeSansBold.ttf", 40) font2 = ImageFont.truetype("config/label_templates/Fonts/FreeSansBold.ttf", 28) draw.text((280, 50), "ETICHETTA \nINTEROPERAZIONALE", (0, 0, 0), font=font) draw.text((280, 150), barcode, (0, 0, 0), font=font2) if not os.path.exists("./tmp/"): os.makedirs("./tmp/") label_img.save(file_name) hdc = win32ui.CreateDC() hdc.CreatePrinterDC(printer_name) hdc.StartDoc(file_name) hdc.StartPage() dib = ImageWin.Dib(label_img.rotate(90, expand=True)) # Ruota di 270 gradi per stampare correttamente dib.draw(hdc.GetHandleOutput(), (0, 0, print_height, print_width)) # Inverto larghezza e altezza hdc.EndPage() hdc.EndDoc() return barcode except Exception as e: self.log.error("Errore durante la stampa dell'etichetta\n\nErrore:\n" + str(e)) return "ERRORE STAMPA"