import win32print import sys import json import os def load_template(filename): script_dir = os.path.dirname(os.path.abspath(__file__)) path = os.path.join(script_dir, filename) with open(path, "r", encoding="utf-8") as f: return f.read() def money(n): return f"{int(float(n)):,}" if n is not None else "0" def build_item_block(item, y_offset): name = item['name'] price = money(item['price']) imei = item['imei'] return f'''TEXT 20,{y_offset},"3",0,1,1,"{name}" TEXT 20,{y_offset+30},"2",0,1,1,"{price} VND" BARCODE 20,{y_offset+60},"128",50,1,0,2,2,"{imei}"''' def print_barcode(tspl_content, printer_name="Xprinter XP-350BM"): h = win32print.OpenPrinter(printer_name) try: win32print.StartDocPrinter(h, 1, ("Print Barcode", None, "RAW")) win32print.StartPagePrinter(h) win32print.WritePrinter(h, tspl_content.encode('utf-8')) win32print.EndPagePrinter(h) win32print.EndDocPrinter(h) finally: win32print.ClosePrinter(h) if __name__ == "__main__": data = json.loads(sys.argv[1]) items = data['items'] # list of {name, price, imei} spacing = 180 # vertical gap between each stacked label, adjust if overlapping/too sparse blocks = [] for i, item in enumerate(items): y_offset = 20 + (i * spacing) blocks.append(build_item_block(item, y_offset)) items_block = "\n\n".join(blocks) template = load_template("barcode_template.txt") tspl = template.replace("{items_block}", items_block) print_barcode(tspl) print("Sent to printer.")