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

如何在热敏打印机纸张上打印水平线?(JS+Python实现场景)

解决方案:在JS打印数据中添加热敏打印机兼容的水平线

核心思路

HTML的<hr>是视觉层面的水平线,但热敏打印机需要打印机指令或者纯文本分隔线来实现等效效果。这里提供两种实用方案:


方案1:纯文本分隔线(简单通用)

直接在JS的打印数据字符串中插入一串重复字符作为分隔线,适配所有热敏打印机。

JS示例代码

// 原有打印数据
const printData = {
  content: "订单号:NO.20240520\n商品:保温杯\n数量:1"
};

// 添加纯文本水平线(可根据纸宽调整字符数量)
printData.content += "\n----------------------------------------\n";
printData.content += "总价:99元\n打印时间:2024-05-20";

// 发送请求到Python后端
fetch('/print', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify(printData),
});

Python端无需额外处理,直接打印接收的字符串即可。


方案2:ESC/POS指令实现实线(专业美观)

大部分热敏打印机支持ESC/POS指令,可通过下划线指令绘制规整的实线。

关键ESC/POS指令说明

  • 开启2点粗细下划线:\x1B\x2D\x02
  • 关闭下划线:\x1B\x2D\x00
  • 满幅空格:根据纸宽调整字符数(80mm纸对应48个英文字符宽度)

JS示例代码

// 定义ESC/POS指令常量
const ESC = '\x1B';
const UNDERLINE_ON = ESC + '\x2D\x02';
const UNDERLINE_OFF = ESC + '\x2D\x00';
const LINE_WIDTH = 48; // 适配80mm纸,58mm纸可改为32

// 构建带水平线的打印数据
const printData = {
  content: "订单号:NO.20240520\n商品:保温杯\n数量:1" +
           `\n${UNDERLINE_ON}${' '.repeat(LINE_WIDTH)}${UNDERLINE_OFF}\n` +
           "总价:99元\n打印时间:2024-05-20"
};

// 发送请求到Python后端
fetch('/print', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify(printData),
});

Python端配合处理

需确保打印时输出原始字节(ESC/POS为二进制指令),示例:

import serial

def print_content(content):
    # 根据实际打印机端口、波特率调整参数
    ser = serial.Serial('COM3', 9600, timeout=1)
    # 编码选择gbk或utf-8,根据打印机支持调整
    ser.write(content.encode('gbk'))
    ser.close()

注意事项

  • 纸宽适配:LINE_WIDTH需根据打印机纸宽调整,避免线条过短或溢出。
  • 编码适配:若出现乱码,可切换gbk/utf-8编码尝试。
  • 指令兼容性:若打印机不支持ESC/POS,优先使用纯文本分隔线方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:25:01