Files
web/print/print_barcode.py
2026-06-26 13:41:27 +07:00

50 lines
1.6 KiB
Python

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.")