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

使用ZPL与Zebra Browser Print打印时重复输出空标签问题求助

解决Zebra ZD230T + Browser Print重复打印空标签的问题

我之前帮好几个用户排查过几乎一模一样的ZD230T搭配Browser Print的打印异常问题,结合你的描述(首次正常、后续出空标签直到红灯),大概率是ZPL指令的纸张参数和打印机校准不匹配,或者Browser Print的指令缓存/设备调用逻辑有问题,咱们一步步来解决:

1. 优先检查ZPL中的标签长度设置(^LL)

你的ZPL里用了^LL203,这个值代表标签的高度(单位是点,ZD230T是203DPI,所以203点=1英寸)。如果这个值和你实际使用的标签纸高度不匹配,打印机就会在打印完有效内容后继续走纸到设置的长度,看起来就是空标签;如果校准的纸张高度比设置的小,还会导致打印机缓冲区混乱,出现持续走纸的情况。

解决步骤

  • 用打印机的自校准功能重新校准:按住FEED键直到指示灯闪绿灯后松开,打印机会自动检测纸张尺寸并校准。
  • ^LL的值改成校准后的实际标签高度(比如你用的是2英寸标签,就改成^LL406),同时确认^PW406(标签宽度)也和实际纸张宽度匹配。

2. 修改打印数量指令(^PQ)避免重复触发

你的ZPL里用了^PQ1,0,1,Y,其中第三个参数是重复打印次数,设置为1意味着打印机将重复打印整个标签格式1次。这可能会导致打印机在完成一次打印后,再次执行空的或缓存的指令,出现额外的空标签。

修改建议
^PQ改成^PQ1,0,0,Y,确保只打印1次,没有重复:

^PQ1,0,0,Y

3. 发送ZPL前先重置打印机缓冲区

有时候Browser Print的驱动会缓存之前的打印指令,导致后续调用时叠加旧内容,引发异常走纸。可以在发送实际打印指令前,先发送一个空的ZPL初始化指令(^XA^XZ),重置打印机的缓冲区。

修改代码示例

const printBarcodeLabel = () => {
  const catalogItem = catalogItems?.find(ci => ci.id === catalogItemId);
  if (!(window as any).BrowserPrint) {
    messageApi.error("Zebra Browser Print不可用,请检查应用是否已安装并启动。");
    console.error("BrowserPrint object not found on window");
    return;
  }

  const initZpl = '^XA^XZ'; // 初始化指令
  const zpl = `
^XA
^MMT
^PW406
^LL203 // 这里改成校准后的高度
^FO20,10^BY2^BCN,60,N,N,N
^FD${catalogItem?.barCode}^FS
^FO20,80^A0N,18,18^FB366,1,0,C^FD${catalogItem?.barCode}^FS
^FO20,105^A0N,20,20^FB366,1,0,C^FD${catalogItem?.name || ''}^FS
^PQ1,0,0,Y
^XZ`.trim();

  (window as any).BrowserPrint.getDefaultDevice(
    'printer',
    (device: any) => {
      if (!device) {
        messageApi.error("未找到默认打印机,请检查Zebra Browser Print应用中的设置。");
        return;
      }
      // 先发送初始化指令,再发送打印指令
      device.send(initZpl, () => {
        device.send(zpl, () => {}, (err: any) => {
          console.error('Print error', err);
          messageApi.error("打印出错,请检查打印机是否已开启并可用。");
        });
      }, (initErr: any) => {
        console.error('Init printer error', initErr);
        // 如果初始化失败,直接尝试打印
        device.send(zpl, () => {}, (err: any) => {
          console.error('Print error', err);
          messageApi.error("打印出错,请检查打印机是否已开启并可用。");
        });
      });
    },
    (err: any) => {
      console.error('Device error', err);
      messageApi.error("请检查Zebra Browser Print是否已启动并设置了默认打印机。");
    }
  );
};

4. 缓存打印机设备实例,避免重复获取

你每次调用打印函数都重新调用getDefaultDevice,可能导致多次创建设备通信实例,引发USB通信冲突。建议在组件挂载时获取一次设备实例并缓存,后续打印直接使用缓存的实例:

优化代码示例

import { useEffect, useState } from 'react';

const YourComponent = () => {
  const [printerDevice, setPrinterDevice] = useState<any>(null);

  // 组件挂载时获取默认打印机
  useEffect(() => {
    if ((window as any).BrowserPrint) {
      (window as any).BrowserPrint.getDefaultDevice('printer', (device: any) => {
        setPrinterDevice(device);
      }, (err: any) => {
        console.error('Failed to get default printer on mount', err);
        messageApi.error("请检查Zebra Browser Print是否已启动并设置了默认打印机。");
      });
    } else {
      messageApi.error("Zebra Browser Print不可用,请检查应用是否已安装并启动。");
    }
  }, []);

  const printBarcodeLabel = () => {
    const catalogItem = catalogItems?.find(ci => ci.id === catalogItemId);
    if (!printerDevice) {
      messageApi.error("未找到默认打印机,请检查Zebra Browser Print应用中的设置。");
      return;
    }

    const initZpl = '^XA^XZ';
    const zpl = `
^XA
^MMT
^PW406
^LL203 // 校准后的高度
^FO20,10^BY2^BCN,60,N,N,N
^FD${catalogItem?.barCode}^FS
^FO20,80^A0N,18,18^FB366,1,0,C^FD${catalogItem?.barCode}^FS
^FO20,105^A0N,20,20^FB366,1,0,C^FD${catalogItem?.name || ''}^FS
^PQ1,0,0,Y
^XZ`.trim();

    printerDevice.send(initZpl, () => {
      printerDevice.send(zpl, () => {}, (err: any) => {
        console.error('Print error', err);
        messageApi.error("打印出错,请检查打印机是否已开启并可用。");
      });
    }, (initErr: any) => {
      console.error('Init printer error', initErr);
      printerDevice.send(zpl, () => {}, (err: any) => {
        console.error('Print error', err);
        messageApi.error("打印出错,请检查打印机是否已开启并可用。");
      });
    });
  };

  // ... 组件其他部分 ...
};

5. 检查驱动与Browser Print版本兼容性

你使用的是v10版本驱动,有时候ZD230T的v10驱动和部分版本的Browser Print存在USB通信兼容性问题。可以尝试:

  • 升级Zebra Browser Print到最新版本
  • 暂时降级驱动到v8或v9版本(Zebra官网可以下载历史驱动)

按这个顺序排查,大概率能解决你的问题——我之前遇到的几个用户都是通过调整^LL参数和添加初始化指令解决的。

内容的提问来源于stack exchange,提问作者Marko

火山引擎 最新活动