#!/usr/bin/env python import requests from zebra import Zebra import qrcode from math import ceil, floor from PIL import Image import textwrap import argparse # make substitutions for characters not in CP437 def subst(s): repl={} repl["®"]="(R)" repl["©"]="(C)" repl["Ω"]="Ω" # U+2126 -> U+03A9, which is in CP437 repl["±"]="+/-" out="" for i in s: try: out=out+repl[i] except: out=out+i return out # filter out characters not in selected codepage # (printer uses CP437) def filter(s, cp): out="" for i in s: try: i.encode(cp) out=out+i except: pass return out # handle escape characters in strings to be printed def esc(s): out="" for i in s: if i=="\"": out=out+"\\\"" elif i=="\\": out=out+"\\\\" else: out=out+i return out # render a line of text at coordinates # return coordinates of next line def textline(s, loc, fontnum): z.output(f"A{loc[0]},{loc[1]},0,{fontnum},1,1,N,\"{esc(filter(subst(s), "cp437"))}\"\n") return (loc[0], loc[1]+font_metrics[fontnum][1]) # wrap text in a bounding box at coordinates # return coordinates of next line and any unused text def textbox(s, loc, bbox, fontnum): wrapped=textwrap.wrap(filter(subst(s), "cp437"), width=floor(bbox[0]/font_metrics[fontnum][0])) line=0 while line*font_metrics[fontnum][1]