你有没有遇到过这种情况:花半小时排好版,点导出时弹窗让你登录;或者下载下来的图片中间印着硕大的水印;又或者"免费试用"的按钮背后藏着自动续费的陷阱。一位开发者受够了这些套路,干脆自己写了一个工具——不用注册、没有水印、不收集邮箱,所有操作都在浏览器本地完成。
这个叫 MakeMyStickers 的工具解决了一个非常具体的问题:把图片拖进 Avery 兼容模板,直接打印。听起来简单,但作者分享了几个真正棘手的实现细节。
![]()
毫米级精度:打印不是像素游戏
![]()
Avery 标签模板(5160、8160、5163、5167 等)用的是真实世界尺寸:标签长宽、边距、间距,单位都是毫米。但屏幕显示用的是 CSS 像素。整个布局引擎内部全程以毫米计算,只在最后一步转成像素。
导出时的处理更关键。画布按打印分辨率渲染:
const DPI = 300;
const canvasW = Math.round(paper.wMM / 25.4 * DPI);
const canvasH = Math.round(paper.hMM / 25.4 * DPI);
300 DPI 下,一张 8.5×11 英寸的纸约为 2550×3300 像素。毫米到像素的转换差之毫厘,30 联标签纸上每一张都会偏离模切线,肉眼清晰可见。
浏览器里直接生成 PDF
没有服务器往返。作者把整张标签页渲染到画布,编码成 JPEG,再用 pdf-lib 库嵌入 PDF:
const blob = await new Promise(resolve =>
sheetCanvas.toBlob(resolve, "image/jpeg", 0.92)
);
const doc = await PDFDocument.create();
页面尺寸严格对应真实纸张,打印时 1:1 输出,不会出现"适应页面"的缩放选项破坏对齐。
![]()
文字自适应:放弃经验公式
让文字自动缩放到固定标签宽度,比想象中麻烦。作者弃用了传统的"平均字符宽度×0.55"估算,改用画布的真实测量:
const ctx = document.createElement('canvas').getContext('2d');
ctx.font = `${size}px ${family}`;
const realWidth = ctx.measureText(label).width;
按实际渲染宽度(区分字体和字重)计算,文字才能填满标签又不溢出模切边缘。
透明 PNG 适配 Cricut 切割机
针对 Print-Then-Cut 机型,工具导出透明背景的 PNG,按 alpha 通道裁剪画布,再缩放到机器的打印区域尺寸,确保导入后保持预期的物理大小。
工具地址是 makemystickers.app。如果你需要打印标签或贴纸,可以试试看。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.