如何在热敏打印机纸张上打印水平线?(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
相关产品推荐
相关产品推荐

