import tabulate from escpos.printer.win32raw import Win32Raw from escpos.printer.usb import Usb from escpos.printer.network import Network from escpos.printer import Dummy from escpos.escpos import Escpos from impresora.order import Order class BasePrinter: def __init__(self): self.bolded = False self.font = "a" self.doubled_size = False self.work = Dummy() self.printer:Escpos def change_font(self): self.font = "b" if self.font == "a" else "a" self.work.set(font=self.font) def text(self, text): # Print the text self.work.text(text+"\n") def bold(self): # Set bold for the next print self.bolded = not self.bolded self.work.set(bold=self.bolded) def double_size(self): # Set double size for the next print self.doubled_size = not self.doubled_size self.work.set(double_height=self.doubled_size, double_width=self.doubled_size) def default(self): # Set default size for the next print self.work.set_with_default() def print_order(self, order:Order, mesa:int = 0): # Print the order details self.default() self.double_size() self.bold() self.text(f"Orden Biergarten Klein\n") self.default() self.text(f"Fecha: {order.date.strftime('%d/%m/%Y: %H:%M:%S')}") self.bold() self.text(f"Mesa: {mesa}\n") self.default() self.text(order.tabulate()) self.bold() self.text(f"Total: {order.total}") self.work.cut() # Print the order details self.printer._raw(self.work.output) self.work.clear() # Intentar cerrar la impresora si el método existe if hasattr(self.printer, 'close'): self.printer.close() class PrinterWindows(BasePrinter): def __init__(self, printer_name="Impresora Termica"): super().__init__() self.printer = Win32Raw(printer_name) class PrinterUSB(BasePrinter): def __init__(self, vendor_id, product_id): super().__init__() self.printer = Usb(vendor_id, product_id,in_ep=0x81,out_ep=0x03) class PrinterNetwork(BasePrinter): def __init__(self, host, port): super().__init__() self.printer = Network(host, port)