printer.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import logging
  2. from venv import logger
  3. from escpos.printer.win32raw import Win32Raw
  4. from escpos.printer.usb import Usb
  5. from escpos.printer.network import Network
  6. from escpos.printer import Dummy
  7. from escpos.escpos import Escpos
  8. from impresora.order import Order
  9. import usb.core
  10. logger = logging.getLogger(__name__)
  11. class BasePrinter:
  12. def __init__(self):
  13. self.bolded = False
  14. self.font = "a"
  15. self.doubled_size = False
  16. self.work = Dummy()
  17. self.printer:Escpos
  18. def is_connected(self):
  19. return self.printer.is_online()
  20. def change_font(self):
  21. self.font = "b" if self.font == "a" else "a"
  22. self.work.set(font=self.font)
  23. def text(self, text):
  24. # Print the text
  25. self.work.text(text+"\n")
  26. def bold(self):
  27. # Set bold for the next print
  28. self.bolded = not self.bolded
  29. self.work.set(bold=self.bolded)
  30. def double_size(self):
  31. # Set double size for the next print
  32. self.doubled_size = not self.doubled_size
  33. self.work.set(double_height=self.doubled_size, double_width=self.doubled_size)
  34. def default(self):
  35. # Set default size for the next print
  36. self.work.set_with_default()
  37. def print_order(self, order:Order, mesa:int = 0):
  38. # Print the order details
  39. self.default()
  40. self.double_size()
  41. self.bold()
  42. self.text(f"Orden Biergarten Klein\n")
  43. self.default()
  44. self.text(f"Fecha: {order.date.strftime('%d/%m/%Y: %H:%M:%S')}")
  45. self.bold()
  46. self.text(f"Mesa: {mesa}")
  47. self.text(f"Cliente: {order.user}\n")
  48. self.default()
  49. self.text(order.tabulate())
  50. self.bold()
  51. self.text(f"Total: {order.total}")
  52. self.work.cut()
  53. # Print the order details
  54. self.printer._raw(self.work.output)
  55. self.work.clear()
  56. # Intentar cerrar la impresora si el método existe
  57. if hasattr(self.printer, 'close'):
  58. self.printer.close()
  59. class PrinterWindows(BasePrinter):
  60. def __init__(self, printer_name="Impresora Termica"):
  61. super().__init__()
  62. self.printer = Win32Raw(printer_name)
  63. class PrinterUSB(BasePrinter):
  64. def __init__(self, vendor_id, product_id):
  65. super().__init__()
  66. self.printer = Usb(vendor_id, product_id,in_ep=0x81,out_ep=0x03)
  67. self.vendor_id = vendor_id
  68. self.product_id = product_id
  69. @staticmethod
  70. def check_usb_port(vendor_id, product_id):
  71. """Check if the USB printer is connected."""
  72. try:
  73. element = usb.core.find(idVendor=vendor_id, idProduct=product_id)
  74. if element is None:
  75. logger.error(f"Printer is not connected on USB port {vendor_id}:{product_id}.")
  76. return False
  77. return True
  78. except Exception as e:
  79. logger.error(f"Error checking USB printer: {e}")
  80. return False
  81. def is_connected(self):
  82. """Check if the USB printer is connected."""
  83. return self.check_usb_port(self.vendor_id, self.product_id)
  84. class PrinterNetwork(BasePrinter):
  85. def __init__(self, host, port):
  86. super().__init__()
  87. self.printer = Network(host, port)