如何在qz-tray ESC/POS Raw打印中设置图片尺寸且不影响其他数据,并实现2份对齐打印?
QZ-Tray ESC/POS Raw打印:图片尺寸设置、多份打印及对齐问题解决方案
我来帮你梳理并解决这几个实际打印中遇到的问题,都是QZ-Tray结合ESC/POS指令时的常见坑:
一、图片尺寸无法生效的核心原因及修复
你说单独打印图片时尺寸能改,混合其他数据就不行,问题出在打印机初始化指令的位置和图片配置的完整性上:
- 你原来把初始化指令
\x1B\x40放在图片之后,这会重置打印机的所有设置,包括图片的渲染参数,自然就覆盖了你的尺寸配置。 - 另外,你没有在图片的
options里明确指定width/height参数,单独打印时QZ可能用了默认适配,但混合指令时就被干扰了。
修复步骤:
- 把初始化指令移到最开头:确保所有打印配置都在初始化之后生效。
- 给图片添加明确的尺寸参数:在
options里加上width和height(单位是打印机的点,比如80mm宽的纸对应576点,你可以根据需求调整),如果想保持比例,只设置其中一个参数即可。 - 可选:给图片单独设置对齐:避免受后续文本对齐指令的影响,在
options里加alignment参数。
修正后的图片配置片段:
{ type: 'raw', format: 'image', flavor: 'file', data: 'assets/img/image_sample_bw.png', options: { language: "ESCPOS", dotDensity: 'double', width: 450, // 自定义宽度,按需调整 alignment: 'center' // 图片单独居中 } },
二、实现2份打印且对齐不变
最省心的方式是用QZ自带的copies配置,不需要手动复制数据,还能保证每份内容的对齐完全一致:
// 创建配置时直接指定打印份数 var config = qz.configs.create("Printer Name", { copies: 2 });
如果遇到某些老打印机不支持copies参数的情况,再考虑手动复制整个data数组,但这种方式容易出错,尽量优先用上面的方法。
三、保持对齐不混乱的注意事项
- 对齐指令要“精准定位”:比如
\x1B\x61\x31(居中)要放在需要居中的文本/图片之前,\x1B\x61\x30(左对齐)要放在左对齐内容的前面,不要随意乱放。 - 避免重复执行初始化指令:
\x1B\x40只需要在打印数据的开头执行一次,多次执行会重置所有设置,导致之前的对齐和图片配置全部失效。 - 图片对齐可以独立配置:像上面说的,给图片的
options加alignment,这样就算后面文本改了对齐方式,图片的位置也不会变。
完整的修正代码
var config = qz.configs.create("Printer Name", { copies: 2 }); var data = [ '\x1B' + '\x40', // 初始化放在最前面,确保所有配置生效 { type: 'raw', format: 'image', flavor: 'file', data: 'assets/img/image_sample_bw.png', options: { language: "ESCPOS", dotDensity: 'double', width: 450, // 设置图片宽度 alignment: 'center' // 图片独立居中 } }, '\x1B' + '\x61' + '\x31', // 文本居中对齐 'Beverly Hills, CA 90210' + '\x0A', '\x0A', 'www.qz.io' + '\x0A', '\x0A', '\x0A', 'May 18, 2016 10:30 AM' + '\x0A', '\x0A', '\x0A', '\x0A', 'Transaction # 123456 Register: 3' + '\x0A', '\x0A', '\x0A', '\x0A', '\x1B' + '\x61' + '\x30', // 左对齐 ]; qz.print(config, data);
内容的提问来源于stack exchange,提问作者Bot coder




