# Lay the cut-size stickers out at 1:1 on an A4 page with dimension lines and a 2 in ruler, to print and check with a real ruler. # usage: python size-reference.py import io, re, sys import numpy as np, cairosvg from PIL import Image SRC, OUT = sys.argv[1:3] NAMES = ["witch-hex-cellent", "bat-going-batty", "vampire-fang-cy", "ghost-boo-always-online", "ghost-no-ghost-customers"] DPI, PAGE_W, PAGE_H = 300, 2480, 3508 INK, DIM, CUT = "#0C2B27", "#C42B60", "#EC008C" def cut_box(svg, px): """Bounding box of the cut line, in the sticker page's own pixels.""" i, j = svg.index(' 128 ys, xs = np.nonzero(a) return xs.min() / 2, ys.min() / 2, (xs.max() + 1) / 2, (ys.max() + 1) / 2 def label(x, y, s, size=34, anchor="middle", rot=0): t = f' transform="rotate({rot} {x} {y})"' if rot else "" return f'{s}' def dim_h(x0, x1, y): tick = 18 return (f'' + label((x0 + x1) / 2, y - 16, f'{(x1 - x0) / DPI:.2f} in')) def dim_v(y0, y1, x): tick = 18 return (f'' + label(x - 16, (y0 + y1) / 2, f'{(y1 - y0) / DPI:.2f} in', rot=-90)) parts = [] cells = [(330, 330), (1290, 330), (330, 1430), (1290, 1430), (330, 2530)] for name, (cx, cy) in zip(NAMES, cells): svg = open(f"{SRC}/{name}.svg").read() w_in = float(re.search(r'width="([\d.]+)in"', svg).group(1)) px = round(w_in * DPI) bx0, by0, bx1, by1 = cut_box(svg, px) inner = re.sub(r']*>', f'', svg, count=1) inner = re.sub(r'.*?', "", inner, flags=re.S).replace('stroke="#EC008C" stroke-width="1"', f'stroke="{CUT}" stroke-width="5"') X0, Y0, X1, Y1 = cx + bx0, cy + by0, cx + bx1, cy + by1 parts += [f'', inner, dim_h(X0, X1, Y0 - 50), dim_v(Y0, Y1, X0 - 50), label(cx + px / 2, cy + px + 70, name, size=30, anchor="middle").replace(DIM, INK)] rx, ry = 1290, 2900 ticks = "".join(f'' for i in range(17)) parts.append(f'' + ticks + label(rx, ry + 70, "0", 34, "middle").replace(DIM, INK) + label(rx + DPI, ry + 70, "1 in", 34).replace(DIM, INK) + label(rx + 2 * DPI, ry + 70, "2 in", 34).replace(DIM, INK) + label(rx + DPI, ry + 150, "2-inch ruler — print at 100% / actual size", 30).replace(DIM, INK)) parts.append(label(PAGE_W / 2, 150, "MyBazaar Halloween stickers — 2 in size check (1:1 on A4)", 46).replace(DIM, INK)) parts.append(label(PAGE_W / 2, 210, "pink = measured size at the cut line · magenta outline = cut · dashed box = outer edge of the cut", 30).replace(DIM, INK)) page = (f'' f'' + "".join(parts) + "") open(f"{OUT}.svg", "w").write(page) cairosvg.svg2pdf(bytestring=page.encode(), write_to=f"{OUT}.pdf") cairosvg.svg2png(bytestring=page.encode(), write_to=f"{OUT}.png", output_width=PAGE_W, output_height=PAGE_H, background_color="#FFFFFF")