You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular点击按钮调用NodeJS实现热敏打印机静默打印问题求助

问题根因

你使用的electron-pos-printer是Electron桌面应用专属依赖,运行时依赖Electron内置的BrowserWindow等桌面专属API,普通Node.js服务运行环境不存在这些API,因此会抛出BrowserWindow is not a constructor错误,该库本身就不支持前后端分离的Web场景。

可行解决方案

后端侧方案(推荐,适配前后端分离部署)

适合热敏打印机和Node.js后端服务部署在同一局域网/设备的场景,Angular前端只需要调用打印接口传递小票数据,打印逻辑完全在后端完成,全程无弹窗。

  • 替换打印依赖为服务端可用的node-thermal-printer,该库不依赖Electron,可直接运行在普通Node.js环境中
  • 首先在后端项目安装依赖:npm install node-thermal-printer
  • 参考示例代码实现打印逻辑:
'use strict';
const ThermalPrinter = require("node-thermal-printer").printer;
const Types = require("node-thermal-printer").types;

class SeriesPrinter {
  constructor() {
    this.printer = new ThermalPrinter({
      type: Types.EPSON, // 多数80mm热敏小票机都兼容EPSON指令,按需对应你的打印机型号调整
      interface: 'tcp://192.168.1.100', // 网络打印机填IP,USB打印机填驱动路径如'printer:POS-80C'
      width: 48, // 80mm纸对应每行48个字符,58mm纸对应32个
      characterSet: 'CHINA', // 需打印中文时修改为对应字符集
      removeSpecialCharacters: false,
    });
  }

  async printSr(printData) {
    try {
      console.log("开始打印");
      // 调整打印格式
      this.printer.alignCenter();
      this.printer.bold(true);
      this.printer.println("Sample text");
      this.printer.bold(false);
      this.printer.alignLeft();
      this.printer.println("Another text");
      // 打印完成后自动切纸
      this.printer.cut();
      // 执行打印
      const printResult = await this.printer.execute();
      return printResult;
    } catch (error) {
      console.error("打印失败:", error);
      throw error;
    }
  }
}

module.exports = SeriesPrinter;
  • 注意:网络打印机需要配置正确的IP和端口,USB打印机需要在部署Node服务的设备上安装对应驱动,填写对应的打印机名称即可,该库支持打印二维码、条形码、自定义边距等常用小票功能。

前端侧方案(适合打印机连接在客户端设备的场景)

适合收银终端等可控客户端场景,热敏打印机直接插在访问前端的用户设备上:

  • Angular前端组装小票HTML内容,通过@media print媒体查询适配小票打印样式,隐藏页面不需要打印的其他元素
  • 给终端的Chrome浏览器配置启动参数--kiosk --kiosk-printing,即可跳过打印对话框,调用window.print()后直接静默输出到默认打印机
  • 参考实现逻辑:
// 对应组件的CSS样式
@media print {
  body * {
    visibility: hidden;
  }
  .receipt-content, .receipt-content * {
    visibility: visible;
  }
  .receipt-content {
    position: absolute;
    left: 0;
    top: 0;
    width: 210px; /* 适配80mm小票宽度 */
  }
}

// 组件打印逻辑
printReceipt() {
  // 组装小票内容
  const receiptEl = document.querySelector('.receipt-content') as HTMLElement;
  receiptEl.innerHTML = `
    <div style="text-align:center; font-weight: bold;">Sample text</div>
    <div>Another text</div>
  `;
  window.print();
}
  • 注意:该方案仅适合内部可控终端使用,公网用户无法强制配置浏览器启动参数,不适用公网场景,打印前需要把终端的默认打印机设置为对应的热敏打印机。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:36:03