50 lines
1.6 KiB
Python
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.") |