You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在qz-tray ESC/POS Raw打印中设置图片尺寸且不影响其他数据,并实现2份对齐打印?

QZ-Tray ESC/POS Raw打印:图片尺寸设置、多份打印及对齐问题解决方案

我来帮你梳理并解决这几个实际打印中遇到的问题,都是QZ-Tray结合ESC/POS指令时的常见坑:

一、图片尺寸无法生效的核心原因及修复

你说单独打印图片时尺寸能改,混合其他数据就不行,问题出在打印机初始化指令的位置和图片配置的完整性上:

  • 你原来把初始化指令\x1B\x40放在图片之后,这会重置打印机的所有设置,包括图片的渲染参数,自然就覆盖了你的尺寸配置。
  • 另外,你没有在图片的options里明确指定width/height参数,单独打印时QZ可能用了默认适配,但混合指令时就被干扰了。

修复步骤:

  1. 把初始化指令移到最开头:确保所有打印配置都在初始化之后生效。
  2. 给图片添加明确的尺寸参数:在options里加上widthheight(单位是打印机的点,比如80mm宽的纸对应576点,你可以根据需求调整),如果想保持比例,只设置其中一个参数即可。
  3. 可选:给图片单独设置对齐:避免受后续文本对齐指令的影响,在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只需要在打印数据的开头执行一次,多次执行会重置所有设置,导致之前的对齐和图片配置全部失效。
  • 图片对齐可以独立配置:像上面说的,给图片的optionsalignment,这样就算后面文本改了对齐方式,图片的位置也不会变。

完整的修正代码

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

火山引擎 最新活动