更新记录

1.1.1(2023-07-03)

修复闪退问题

1.1.0(2023-06-25)

1:增加TSPL指令封装 2:集成商米打印SDK,支持商米一体打印PDA 3:优化ESC模式下画线方式

1.0.9(2023-02-09)

1:使用原始cpcl命令时,自动拼接\r\n

查看更多

平台兼容性

Android Android CPU类型 iOS
适用版本区间:4.4 - 11.0 armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 ×

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择


通用安卓蓝牙打印

1. 简介

本插件为仅支持安卓平台的蓝牙打印原生插件,已经基于标准ESC、CPCL指令进行了指令二次封装。采用json数据交互简单易用,可打印文本、图片、二维码、一维码、表格等。
插件也支持其它格式的打印指令,如zpl、tsc等,但是非ESC、CPCL的指令没有提供二次封装,需要开发者使用原始指令。
请先使用测试程序按照下图进行测试:

下载测试程序

注意:测试程序上面“商米小票打印”、“商米标签打印”仅针对商米一体打印机,如sunmi v2s plus

2. 使用流程

  1. 确定打印机支持的打印指令,可以查看产品说明书或者跟厂商技术支持咨询
  2. 获取设备列表(需要先在安卓系统设置里面进行蓝牙配对)
  3. 连接设备
  4. 发送数据(需要根据打印机使用不同的打印指令)
  5. 打印机打印
  6. 如果无法获取设备列表,可能是高版本安卓导致,需要增加对应蓝牙附近设备权限, 并把APP的“附近设备”权限”打开-关闭-打开”,刷新一遍

3. 示例代码

3.1 cpcl方式打印

<template>
<div>
    <button type="primary" @click="refresh">刷新已配对设备列表</button>
    <button type="primary" @click="connect">连接</button>
    <button type="primary" @click="disconnect">断开连接</button>
    <button type="primary" @click="print">打印</button>
    <button type="primary" @click="getState">获取状态</button>
    <button type="primary" @click="addBroadcastReceiver">注册断开连接广播</button>
    <button type="primary" @click="removeBroadcastReceiver">移除断开连接广播</button>
    <div>
      <div>当前选择设备: {{device.name}}</div>
      <div>
        <div v-for="item in devices" @click="selectDevice(item)" :key="item.address">{{item.name}}</div>
      </div>
    </div>
  </div>
</template>

<script>
  // 获取 module,所有接口返回的数据格式为json: {success: true, msg: '' , data: Object}
  var printerModule = uni.requireNativePlugin("ammagician-printer")
  const modal = uni.requireNativePlugin('modal');

  //主动监听蓝牙设备断开后,插件向外发送的事件。该事件依赖于插件内部注册的广播。
  printerModule.addEventListener('disConnect', function (e) {})

  export default {
    data() {
      return {
        device: {
          name: ''
        },
        devices: []
      }
    },
    methods: {
      isReady(){
        //蓝牙是否打开
        printerModule.isReady({}, (ret) => {
          modal.toast({
            message: JSON.stringify(ret.data),
            duration: 1.5
          });
        })
      },
      //是否连接了设备
      isConnect(){
        printerModule.isConnect({}, (ret) => {
          modal.toast({
            message: JSON.stringify(ret.data),
            duration: 1.5
          });
        })
      },
      //获取当前连接设备的地址
      getConnectDevice(){
        printerModule.getConnectDevice({}, (ret) => {
          modal.toast({
            message: JSON.stringify(ret.data),
            duration: 1.5
          });
        })
      },

      //打开蓝牙
      openBluetooth(){
        printerModule.openBluetooth({}, (ret) => {
          modal.toast({
            message: JSON.stringify(ret.data),
            duration: 1.5
          });
        })
      },
      //关闭蓝牙
      closeBluetooth(){
        printerModule.closeBluetooth({}, (ret) => {
          modal.toast({
            message: JSON.stringify(ret.data),
            duration: 1.5
          });
        })
      },

      //获取绑定的设备, 返回data为{success: true, msg: '' , data: [name: 'xx', address: 'yyy', type: 0|1|2|3]}
      //设备类型0:未知 1:低功耗 2:经典蓝牙 3:低功耗、经典蓝牙双模
      refresh() {
        printerModule.getDevices({}, (ret) => {
          modal.toast({
            message: JSON.stringify(ret.data),
            duration: 1.5
          });
          this.devices = ret.data;
        })
      },

      //选择设备
      selectDevice(item) {
        modal.toast({
          message: item.name,
          duration: 1.5
        });
        this.device = item
      },

      //连接设备
      connect() {
        if (this.device) {
          //参数为设备地址
          printerModule.connect({
              'address': this.device.address
            },
            (ret) => {
              modal.toast({
                message: ret.msg,
                duration: 1.5
              });
            })
        }
      },

      //断开设备
      disconnect() {
        printerModule.disconnect({},
          (ret) => {
            modal.toast({
              message: ret.msg,
              duration: 1.5
            });
          })
      },

      //打印
      print() {
        if (this.device) {
          printerModule.print({
              'encoding':"gbk", //默认为gbk
              'cmdType': "cpcl",
              'data': [
                { type: 'setup', offset: 0, dpi_w: 200, dpi_h: 200, width:600, height: 620, qty:1}, //设置打印页面,必须存在
                { type: 'pageEnd'},
                { type: 'setAlign', value:0},
                { type: 'text', content: 'CPCL打印测试', font:0, value:4, bold:1, widthScale:2, heightScale:2, x:100, y:20 },
                { type: 'box', x: 10, y: 0, x1: 560, y1: 600, width:2 },
                { type: 'line', x: 10, y: 50, x1: 560, y1: 50, width:3 },
                { type: "text", content:"反色显示", font:24, value:0, x:20, y:60},
                { type: "text", content:"重量:6.980", font:24, value:0, x:20, y:90,},
                { type: "inverse", x:20, y:60, x1:300, y1:60, width:60},
                { type: "text", content:"材料代码:80050008", font:24, value:0, x:20, y:120, underline:1},
                { type: 'text', content:"第一行\r\n第二行\r\n第三行", font:24, value:0, x:20, y:150, height: 30}, 
                { type: 'qrcode', codeType:1, width:120, height:120, x:50, y:360, density:3, content:"www.baidu.com" },
                { type: 'qrcode', codeType:2, x:240, y:360, tolerant: 1, content:"www.baidu.com" },   
                { type: 'qrcode', codeType:0, minDot_w: 2, minDot_h:6, cap:3, tolerant:0, x:20, y:520, content:"www.baidu.com" },
                { type: 'barcode', barcodeType:"128", width:1, height:60, x:300, y:520, content:"123456789", textPos: 1, font:0, value:2}, 
                { type: 'from'},
                { type: 'print'}  //触发打印命令,放在最后
              ]
            },
            (ret) => {
              modal.toast({
                message: ret.msg,
                duration: 1.5
              });
            })
        }
      },

      //获取打印机状态
      getState(){
        //获取打印机状态: timeout(100~1000) retry(1~10)  cmd十进制命令数组   resultLength返回结果字节数
        //具体的命令以及返回结果长度,需要参考具体打印机厂商的开发文档。
        printerModule.getState({timeout:500, retry:1, cmd:[29, 153], resultLength: 4},
          (ret) => {
            modal.toast({
              message: ret.msg,
              duration: 1.5
            });
          })
      },
      //默认情况下,插件会自动向系统注册蓝牙断开的广播,如果被调用removeBroadcastReceiver移除后。可以重新加回来
      addBroadcastReceiver(){
        printerModule.addBroadcastReceiver({},
          (ret) => {
            modal.toast({
              message: ret.msg,
              duration: 1.5
            });
          })
      },
      //默认情况下,插件会自动向系统注册蓝牙断开的广播,可以调用removeBroadcastReceiver移除。为了避免系统内存泄漏,建议在系统退出是调用此方法
      removeBroadcastReceiver(){
        printerModule.removeBroadcastReceiver({},
          (ret) => {
            modal.toast({
              message: ret.msg,
              duration: 1.5
            });
          })
      }
    }
  }
</script>

CPCL示例打印结果:

3.2 ESC方式打印

使用 ESC 方式需要将 cmdType 设置为 "esc", 同时指令也跟 CPCL 方式有一定的区别

let imgStr = '我是base64图片数据,需要替换为真正的BASE'
let jsonData = {
  cmdType: 'esc',
  data: [
    { type: 'setAlign', value: 1 },
    { type: 'feedLine', value: 2 },
    { type: 'text', content: 'ESC打印测试\n', value: 30, bold: 1 },
    { type: 'feedEnter' },
    { type: 'setAlign', value: 0 },
    { type: 'text', content: '**********************************************\n' },
    { type: 'text', content: '钢卷号:S945500150-450101\n', absolute: true, x: 5, underline: 1 },
    { type: 'text', content: '重量:6.980\n', absolute: true, x: 5 },
    { type: 'text', content: '供应商代码:450101\n', absolute: true, x: 5 },
    { type: 'text', content: '材料名称:热镀锌板Q235A 2.0x1250xC\n', absolute: true, x:15},
    { type: 'text', content: '材料代码:80050008\n', absolute: true, x: 5 },
    { type: "text", content:"第一列", midContent:"中间列", rightContent:"第三列", absolute:true, x:5},
    { type: 'text', content: '**********************************************\n' },
    { type: 'qrcode', content: 'www.baidu.com', width: 120, height:120, absolute: true, x: 25},
    { type: 'feedEnter' },
    { type: 'qrcode', codeType:0, content: 'www.baidu.com', width: 280, height:80, absolute: true, x: 50},
    { type: 'feedDot', value: 10 },
    { type: 'barcode', content: '123456789', width:240, height: 40, absolute: true, x: 100,},
    { type: 'feedLine', value: 3 },
    { type: 'setAlign', value: 1 },
    { type: 'text', content: '---------测试图片----\n', rotate: 1 },
    { type: 'image', width: 240, height: 240, absolute: true, x: 200, content: imgStr },

    { type: 'text', content: '\n-----------------绘制线条-------------\n' },
    { type: 'setAlign', value: 0 },
    { type: 'line', width: 300, height: 2 },
    { type: 'feedEnter'},
    { type: 'line', absolute: true, x: 50, y: 60, width: 300, height: 2 },
    { type: 'feedEnter'},
    { type: 'feedLine', value: 1 },

    { type: 'setAlign', value: 1 },
    { type: 'text', content: '-----------------设置Tab-------------\n' },
    { type: 'setAlign', value: 0 },
    { type: 'setTab', tabs: [10, 22, 34, 42] },
    { type: 'text', content: '运单号    到达站点    货物名称    件数    运费\n' },
    { type: 'text', content: '1234567' },
    { type: 'moveTab' },
    { type: 'text', content: '珠海' },
    { type: 'moveTab' },
    { type: 'text', content: '五香瓜子' },
    { type: 'moveTab' },
    { type: 'text', content: '5包' },
    { type: 'moveTab' },
    { type: 'text', content: '1毛' },
    { type: 'feedEnter' },
    { type: 'setAlign', value: 1 },
    { type: 'text', content: '-----------------设置Tab end-------------\n' },
    { type: 'feedLine', value: 2 },
    { type: 'pageEnd' },
  ],
}

printerModule.print(jsonData, (ret) => {
  modal.toast({
    message: ret.msg,
    duration: 1.5,
  })
})

ESC 示例打印结果:

3.3 TSPL方式打印

使用 TSPL 方式需要将 cmdType 设置为 "tspl", encoding设置为"UTF-8", 同时指令也跟 CPCL 方式有一定的区别

let imgStr = '我是base64图片数据,需要替换为真正的BASE'
let jsonData = {
  cmdType: 'tspl',
  data: [
    { type: 'setup', width:590, height: 620},
    { type: 'gap', x: 0, y: 0 },
    {type:"text","content":"钣金入库标签(HSF)",widthScale:2,heightScale:2,x:288,y:20,align:1},
    {type:"barcode",content:"QTBJ10010023",barcodeType:"128",height:50,narrow:2,wide:2,textPos:1,align:1,y:70,x:288},
    {x:10,y:165,type:"text",content:"物料名称:过线盖"},
    {x:10,y:205,type:"text",content:"物料编码:01413068"},
    {x:10,y:245,type:"text",content:"物料图号:KFR35WJ33D.09000001-b"},
    {x:10,y:285,type:"text",content:"工作中心:BJCY01"},
    {x:10,y:325,type:"text",content:"批次/订单数量:6/70"},
    {x:10,y:365,type:"text",content:"生产时间:2022-12-19 14:50:44"},
    {x:10,y:405,type:"text",content:"总装订单/线体:WERW34535 FDTG563"},
    {x:10,y:445,type:"text",font:"TSS24.BF2",content:"操作工:钣_操作工"},
    {type:"qrcode",content:"lyen-bdc|unitmes-nanjing|88c7f2332f795d94bc5fb96e17995e5b",y:450,x:400},
    {type:"print", x:1,y:1}
  ],
}

printerModule.print(jsonData, (ret) => {
  modal.toast({
    message: ret.msg,
    duration: 1.5,
  })
})

TSPL 示例打印结果:

3.4 商米标签打印

使用商米标签打印方式需要将 cmdType 设置为 "sunmi_label", 指令参考商米API。其中style参数被打散为API参数,bool参数改为int型,大于0为true

let imgStr = '我是base64图片数据,需要替换为真正的BASE'
let jsonData = {
  cmdType: 'sunmi_label',
  data: [
    {type: 'setup', width:590, height: 620},
    {type:"text",text:"钣金入库标签(HSF)",bold:1, textWidthRatio:2,textHightRatio:2,posX:288,y:20,align:2},
    {type:"barcode",text:"QTBJ10010023",barcodeType:"CODE128",height:50,dotWidth:2,readable:2,align:2,posY:70,posX:288},
    {posX:10,posY:165,type:"text",text:"物料名称:过线盖"},
    {posX:10,posY:205,type:"text",text:"物料编码:01413068"},
    {posX:10,posY:245,type:"text",text:"物料图号:KFR35WJ33D.09000001-b"},
    {posX:10,posY:285,type:"text",text:"工作中心:BJCY01"},
    {posX:10,posY:325,type:"text",text:"批次/订单数量:6/70"},
    {posX:10,posY:365,type:"text",text:"生产时间:2022-12-19 14:50:44"},
    {posX:10,posY:405,type:"text",text:"总装订单/线体:WERW34535 FDTG563"},
    {posX:10,posY:445,type:"text",text:"操作工:钣_操作工"},
    {type:"qrcode",text:"lyen-bdc|unitmes-nanjing|88c7f2332f795d94bc5fb96e17995e5b",posY:450,posX:400,dot:4},
    {type:"image",content:imgStr,posY:500,posX:200,width:80,height:80},
    {type:"print", value:1}
  ],
}

3.5 商米小票打印

使用商米标签打印方式需要将 cmdType 设置为 "sunmi_ticket", 指令参考商米API。其中style参数被打散为API参数,bool参数改为int型,大于0为true

let imgStr = '我是base64图片数据,需要替换为真正的BASE'
let jsonData = {
  cmdType: 'sunmi_ticket',
  data: [
    {type: 'setup', width:590, height: 620,align:2},
    {type:"printText",text:"钣金入库标签(HSF)",bold:1, textWidthRatio:1,textHightRatio:1},
    {type:"barcode",text:"QTBJ10010023",barcodeType:"CODE128",height:50,dotWidth:2,readable:2,align:2},
    {type: 'setup', align:1},
    {type:"printText",text:"物料名称:过线盖"},
    {type:"printText",text:"物料编码:01413068"},
    {type:"printText",text:"物料图号:KFR35WJ33D.09000001-b"},
    {type:"printText",text:"工作中心:BJCY01"},
    {type:"printText",text:"批次/订单数量:6/70"},
    {type:"printText",text:"生产时间:2022-12-19 14:50:44"},
    {type:"printText",text:"总装订单/线体:WERW34535 FDTG563"},
    {type:"printText",text:"操作工:钣_操作工"},
    {type:"qrcode",text:"lyen-bdc|unitmes-nanjing|88c7f2332f795d94bc5fb96e17995e5b",dot:4,align:2},
    {type:"image",content:imgStr,width:80,height:80,align:2},
    {type:"print"}
  ],
}

3.6 cmdType说明

通过cmdType区分打印机使用的指令类型,ESC适用于打印长度不固定内容,排版能力弱,比如流水单。 CPCL是一种以页面排版方式的指令集,适用于打印长度固定内容,比如价签,快递单。 每项数据通过 type 来区分不同的打印指令,ESC和CPCL下的指令略有不同。

3.7 encoding说明

插件中默认使用的编码方式为gbk。 出现乱码可以尝试以下方式解决:

  1. 更改encoding为其他编码。
  2. 可以尝试设置打印机。
  3. 或者在指令中指定字体文件,如以下zpl指令: "^FO0,45^A@N,36,18,E:MSUNG24.FNT^FD箱码:^FS"

3.8 非ESC/CPCL/TSPL指令打印示例

原始的打印机指令分为 “整型” 和 “字符串”两种。 ESC为典型的“整型”类型,它支持十进制、十六进制的格式,比如下列设置行间距指令: 十六进制: 0x1B 0x33 n
十进制: 27 51 n CPCL为典型的“字符串”类型,它支持字符串的格式,比如下列打印文字的指令: TEXT 7 0 210 60 HORIZ.

3.8.1整型指令示例

使用esc等“整型”指令, 需要将 cmdType 设置为 "esc",然后将原始指令的十进制形式放入esc数组中。

let jsonData = {
  cmdType: 'esc',  
  data: [
    { type: 'esc', esc: [27,51,2] }, // 发送原始命令,指令必须为十进制数值。
  ],
}

使用插件封装的ESC指令,配合原始指令进行自由组合可以实现复杂功能。该方式仅支持二次封装的ESC指令和原始ESC指令的混用

let jsonData = {
  cmdType: 'esc',  
  data: [
    { type: 'setAlign', value: 1 },
    { type: 'esc', esc: [27,51,2] }, // 发送原始命令,指令必须为十进制数值。
    { type: 'feedLine', value: 2 },
    { type: 'text', content: 'ESC打印测试\n', value: 30, bold: 1 },
    { type: 'esc', esc: [27,51,5] }, // 发送原始命令,指令必须为十进制数值。
  ],
}

3.8.2 字符串型指令示例

使用cpcl等“字符串”指令, 需要将 cmdType 设置为 "cpcl",然后将原始指令的字符串放入cpcl数组中。

//发送原始cpcl指令
let jsonData = {
  cmdType: 'cpcl',  
  data: [
    { type: 'cpcl', cpcl: ["BARCODE 128 1 1 50 150 10 HORIZ ", "TEXT 7 0 210 60 HORIZ"] }, // 发送原始命令,指令必须为字符串。
  ],
}
//发送原始zpl指令
jsonData = {
  cmdType: 'cpcl',  
  data: [
    {type: 'cpcl', cpcl: [
      "^XA^MNW^JUS^CI28",
      "^FO0,45^A@N,36,18,E:MSUNG24.FNT^FD箱码:^FS",
      "^FO90,25^JMA^MD20^BY2,3,320^BCN,60,Y,N,N^FD1234567890^FS",
      "^FO0,100^A@N,36,18^FD类型:直通^FS",
      "^PQ1,0,1,Y",
      "^XZ"
      ] 
    }, // 发送原始命令,指令为字符串,请参考各指令编程文档
  ]
}

使用插件封装的cpcl指令,配合原始指令进行自由组合可以实现复杂功能。该方式仅支持二次封装的cpcl指令和原始cpcl指令的混用

let jsonData = {
  cmdType: 'cpcl',  
  data: [
    {type:'setup', offset: 0, dpi_w: 200, dpi_h: 200, width:600, height: 620, qty:1},
    {type: 'cpcl', cpcl: ["TEXT 55 0 4 2 $"] },
    {type:'box',x:0, y:0, x1:560, y1:500,width:2},
    {type:'text',content:"生产订单:122",font:24,value:0,x:10,y:60}, 
    { type: 'from'},
    { type: 'print'} 
  ],
}

4. 二次封装指令完全说明

以下内容为针对本插件提供的二次封装指令的完全,使用者 切勿 完全照搬作为示例.

4.1 ESC二次封装指令说明

let imgStr = '我是base64图片数据,'

//ESC格式,由于各个厂商设备支持力度、固件不一样。字体、字体大小、一维码类型、容错等级、打印速度等的设置需要参考打印机说明。
let jsonData = {
  cmdType: 'esc',  
  data: [
    { type: 'esc', esc: [27,100,2] }, // 发送原始命令,指令为十进制数值。
    { type: 'setup',maxCharCount:48 }, // 设置当前字体设置下每行支持最大字符数,用于计算2列、3列的空白符个数
    { type: 'reset' }, // 重置打印机
    { type: 'setMode', value: 0 }, // 设置打印模式 0:标准模式 1:页模式, 未经测试
    { type: 'setPage', x: 20, y: 10, width: 300, height: 400 }, // 页模式下设置打印区域, 未经测试
    { type: 'setRotate', value: 0  }, // 页模式下设置打印方向 0 1 2 3, 未经测试
    { type: 'pluse', value: 10, x:10, y: 10 }, // 钱箱脉冲,未经测试  value  = 0, 1, 48, 49 0 ≤ x ≤ 255, 0 ≤ y ≤ 255。
    { type: 'pageLeft' }, // 走纸至左边黑标
    { type: 'pageRight' },  //走纸至右边黑标
    { type: 'pageEnd' },  //走纸到标签缝
    { type: 'cutPaper' }, // 半切,未经测试
    { type: 'cutPaper', value: 1 }, // 全切,未经测试
    { type: 'setLineSpace', value: 10 }, // 设置行间距为10
    { type: 'setCharSpace', value: 10  }, // 设置字符左右间距为10
    { type: 'setLeftMargin', value: 10  }, // 设置左边距10, 
    { type: 'setRightMargin', value: 10  }, // 设置右边距10, 
    { type: 'setAlign', value: 0 }, //设置对齐方式,行首有效(0:左对齐, 1:居中, 2:右对齐)
    { type: 'setTab', tabs: [10, 22, 34, 42] },  //设置4个tab位置点,单位为点
    { type: 'moveTab' },  //移动到下一TAB位置
    { type: 'feedEnter' }, //打印内容并换行
    { type: 'feedLine', value: 2 }, //打印内容并走纸 2行
    { type: 'feedDot', value: 2 }, //打印内容并走纸 2点
    { type: 'feedBack', value: 2 }, //打印内容并退纸 2点,未经测试
    { type: 'space', value: 10 }, //连续打印10个空格
    { type: 'line', absolute: true, x: 50, width: 300, height: 1 }, //从x=50处画横线,长300, 高1
    { type: 'text', content: '1234567' },  //默认打印文本
    { type: 'text', content: '钣金喷涂分厂物料合格标识', value: 30, bold: true, underline: true, rotate: 1 }, //默认位置打印内容,字体大小为30、祖体、带下横线、文字旋转90度(0,1,2,3)
    { type: 'text', content: '钢卷号:S945500150-450101', absolute: true, x: 5, underline: true }, //绝对位置打印文本,带下横线,absolute为true时表示绝对位置
    { type: 'text', content: '左边内容', rightContent: '右边内容\n' }, //双列打印
    { type: 'text', content: '左边内容', midContent: '中间内容', rightContent: '右边内容\n' }, //三列打印
    { type: 'image', width: 200, height: 50, absolute: true, x: 200, content: imgStr },  //绝对位置打印图片, width为宽度, height为高度,content为base64图片数据
    { type: 'qrcode', content: 'www.baidu.com', absolute: true, x: 460,  codeType: 2, tolerant: 0, qrVersion: 1 }, //绝对位置打印二维码,unit为条码单元大小. codeType二维码类型 0 :PDF417  1 :DataMatrix 2 :QRCode    tolerant容错级别QRCode: [ 0 1 2 3]  PDF417: [ 0 1 2 3 4 5 6 7 8]  
    { type: 'barcode', content: '123456789', width: 160, height: 40, absolute: true, x: 140, barcodeType:"128"},  //绝对位置打印条码,height条码高度,width条码宽度,barcodeType一维码类型(UPCA,UPCE,EAN13,EAN8,39,93,128,I2OF5,CODEBAR)
  ],
}

4.2 CPCL二次封装指令说明

CPCL格式,由于各个厂商设备支持力度、固件不一样。因此字体、字体大小、一维码类型、容错等级、打印速度等的设置需要参考打印机说明。cpcl指令先后顺序有一定影响,请参考cpcl文档

jsonData = {
  cmdType: 'cpcl',  
  data: [
    {type: 'cpcl', cpcl: ["TEXT 55 0 4 2 $"] }, // 发送原始命令,指令为字符串,请参考cpcl文档
    {type:'setup', offset: 0, dpi_w: 200, dpi_h: 200, width:600, height: 620, qty:1},  //设置水平补偿点数offset,水平分辨率dpi_w,垂直分辨率dpi_h,标签的最大高度点数height,标签的最大宽度点数width,打印次数qty'
    {type:'pageEnd'}, //设置标签检测指令,和FORM配合使用后,打印完后走纸到标签
    {type:'pageLeft'}, //设置标签检测指令,和FORM配合使用后,打印完后走纸到左侧标签
    {type:'pageRight'}, //设置标签检测指令,和FORM配合使用后,打印完后走纸到右侧标签
    {type:'background',value:110},  //设置水印文字灰度级,0-255
    {type:'setAlign',value:0}, //设置对齐方式 0左对齐 1居中 2右对齐 
    {type:'setCharSpace',value:5},  //设置字符间距为5
    {type:'text',content:"钣金喷涂分厂物料合格标识",font:55,value:4,bold:0,underline:0,widthScale:1, heightScale:1,x:10,y:10,rotate:0}, //添加文字,字体55,字体大小4,不加粗,不加下划线,宽度、高度缩放为1,坐标(10,10),旋转角度为0(0,90,180,270)。
    {type:'setCharSpace',value:0}, //设置字符间距为默认
    {type:'setAlign',value:2}, //设置右对齐 
    {type:'text',content:"HSF ",font:0, value:3, bold:1, underline:1, x:0, y:20}, //添加文字,字体0,字体大小3,加粗,加下划线,坐标(0,20)。
    {type:'setAlign',value:0}, //设置左对齐 
    {type:'box',x:0, y:0, x1:560, y1:500,width:2}, //添加矩形起点(0,0),终点(560,500),线宽2
    {type:'line',x:0, y:50,x1:560, y1:50,width:3}, //添加线条起点(0,50),终点(560,50),线宽3
    {type:'setAlign',value:0}, //设置左对齐 
    {type:'text',content:"生产订单:122",font:24,value:0,x:10,y:60}, //添加文字
    {type:'text',content:"物料名称/编号:122",font:24,value:0,x:10,y:90,}, //添加文字
    {type:'inverse',x:10, y:60,x1:300, y1:60,width:60}, //反白显示,起点(10,60),终点(300,60),线宽60,在此区域内的内容将反白显示
    {type:'text',content:"物料图号:122\r\n工作中心:122\r\n工艺路径:122",font:24,value:0,x:10,y:120,height: 30},  //添加多行文字,每行高度为30,height为0时表示为单行显示
    {type:'text',content:"批次/订单数量:122",font:24,value:0,x:10,y:210,}, //添加文字
    {type:'text',content:"操作工:122",font:24,value:0,x:10,y:240,}, //添加文字
    {type:'bktext',content:"生产时间:122",font:24,value:0,x:10,y:270,}, //添加水印文字
    {type:'concat',concats:["4 2 5 $","4 3 0 12","4 2 5 34",],x:10,y:300,}, //添加单行不同格式文字,示例为在(10,300)开始显示不同格式的文字。$字体为4,字体大小为2,偏移为5;12字体为4,字体大小为3,偏移为0;34字体为4,字体大小为2,偏移为5
    {type:'qrcode',codeType:1,width:120,height:120,x:10,y:360,density:3,content:"www.baidu.com" },  //添加DATAMATRIX码,不显示标识符,DATAMATRIX条码点密度density为3
    {type:'qrcode',codeType:2,x:140,y:360,tolerant: 1, qrScale: 6, content:"www.baidu.com" }, //添加二维码,不显示标识符,120*120。容错等级3(非常高的可靠和密度等级),2(高可靠等级),1(标准等级),0(高密度等级), qrScale:设置放大缩小(1-32,默认为6)
    {type:'image',width:120,height:120,x:320,y:360, content: imgStr },  //添加图片,数据为base64格式
    {type:'qrcode',codeType:0, minDot_w: 2, minDot_h:6, cap:3, tolerant:0, x:0,y:520,content:"www.baidu.com" },  //添加PDF-417码,宽度最小点数minDot_w为2,高度最小点数minDot_h为6,每行容纳的码数cap为3,容错等级为0
    {type:'barcode',barcodeType:"128",width:1,height:60,x:300,y:520,content:"123456789",textPos: 1,font:0,value:2}, //添加一维码,类型为“128”(参考打印机说明),显示标识符,标识符字体为0,标识符字体大小为2'
    {type:'background',value:0},  //设置水印文字灰度级为默认
    {type:'from'}, //设置打印结束后,并走纸到定位点。 必须要在print之前
    {type:'print'}  //执行打印控制内容 
    {type:'cutPaper', value: 0}  //切纸, 0半切 1全切

    //其他指令
    {type:'end', }  //结束指令
    {type:'abort'}  //取消指令
    {type:'preFeed', value: 10}  //打印前进纸10 
    {type:'postFeed', value: 20}  //打印后进纸20
    {type:'wait', value: 8}  //打印一张后,需要等待设置的时间过后才打印第二张。延时8*(1/8)秒的时间 
    {type:'contrast', value: 0}  //设置打印对比度0-3
    {type:'zprotate', value: 0}  //旋转打印0 90 180 270
    {type:'speed', value: 0}  //设置打印速度0-5,0最慢
  ]
}

4.3 TSPL二次封装指令说明

TSPL格式,由于各个厂商设备支持力度、固件不一样。因此字体、字体大小、一维码类型、容错等级、打印速度等的设置需要参考打印机说明。TSPL指令先后顺序有一定影响,请参考TSPL文档

jsonData = {
  cmdType: 'tspl',  
  data: [
    {type: 'tspl', tspl: ["size 600, 500"] }, // 插入发送原始命令,指令为字符串,请参考TSPL文档, 
    {type:'reset'}, //重置打印机
    { type: 'setup', width:590, height: 620}, //设置初始参数,width: 标签宽度,单位为dot; height:标签高度,单位为dot;该指令同时设置了direction reference cls三个指令
    { type: 'size', width:590, height: 620}, //设置标签宽高,width: 标签宽度,单位为dot; height:标签高度,单位为dot;
    { type: 'gap', x: 0, y: 0 }, //设置两张标签之间空白距离,以及左右两边空白宽度,x: 标签之间空白距离,单位为dot; y:左右两边空白宽度,单位为dot; 同时设置为0,则为连续纸
    { type: 'direction', x: 0, y: 0 }, //设置打印方向,以及镜像打印,x: 打印方向; y:是否镜像; 默认为 0 0
    { type: 'feedDot', value: 0 }, //设置走纸距离; value:走纸距离,单位为dot;
    { type: 'feedBack', value: 0 }, //设置退纸距离; value:退纸距离,单位为dot;
    { type: 'form', }, //走纸一张标签纸
    { type: 'feedHome'}, //走纸到下一正确打印位置
    { type: 'wait', value: 0 }, //延迟执行命令,value:延迟毫秒数
    { type: 'speed', value: 0 }, //设置打印速度
    { type: 'density', value: 0 }, //设置打印黑度
    { type: 'cls'}, //清除缓冲区
    { type: 'country', content: "" }, //设置国际字符集
    { type: 'codePage', content: "" }, //设置国际代码页
    { type: 'cutPaper'}, //切纸
    { type: 'line', x: 0, y: 0, x1:100, y1: 100, thickness: 1 }, //打印直线,x: 起点X; y:起点Y; x1:终点x  y1:终点Y  thickness:线宽
    { type: 'bar', x: 0, y: 0, width: 100, height: 10 }, //打印矩形块,可以用来打印直线。x: 起点X; y:起点Y; width:宽度  height:高度
    { type: 'box', x: 0, y: 0, x1:100, y1: 100, thickness: 1, radius: 2 }, //打印线框,x: 起点X; y:起点Y; x1:终点x  y1:终点Y  thickness:线宽  radius: 圆角
    { type: 'circle', x: 0, y:0,  diameter: 10, thickness: 1 }, //打印圆,x: 起点X; y:起点Y; diameter:直径  thickness:线宽
    { type: 'ellipse', x: 0, y: 0, width: 100, height: 10, thickness: 1 }, //打印椭圆,x: 起点X; y:起点Y; width:宽度  height:高度  thickness:线宽
    { type: 'erase', x: 0, y: 0, width: 100, height: 10 }, //擦除,。x: 起点X; y:起点Y; width:宽度  height:高度
    {type:"text","content":"钣金入库标签(HSF)",widthScale:2,heightScale:2,x:288,y:20,align:1,rotate: 0, font: 'TSS24.BF2'}, //打印文字,x: 起点X; y:起点Y; content:内容  widthScale:文字X方向放大倍数  heightScale:文字Y方向放大倍数   align:对齐方式,(0:左 1:居中 2:右) rotate:旋转角度(0 90 180 270) font:字体,默认为TSS24.BF2
    {type:"block","content":"钣金入库标签(HSF)",width: 100, height: 50, space: 10, fit:0,  widthScale:2,heightScale:2,x:288,y:20,align:1,rotate: 0, font: 'TSS24.BF2'}, //打印文字块,x: 起点X; y:起点Y; content:内容  width:宽度  height:高度 widthScale:文字X方向放大倍数  heightScale:文字Y方向放大倍数   align:对齐方式,(0:左 1:居中 2:右) rotate:旋转角度(0 90 180 270) font:字体,默认为TSS24.BF2  space:增加行间距  fit: 是否收缩文字
    {type:"barcode",content:"QTBJ10010023",barcodeType:"128",height:50,narrow:2,wide:2,textPos:1,align:1,y:70,x:288, rotate: 0}, //打印条码,x: 起点X; y:起点Y; content:内容  barcodeType:条码类型   align:对齐方式,(0:左 1:居中 2:右) textPos:条码文字,(0:无 1:左 2:中 3:右) rotate:旋转角度(0 90 180 270) wide:宽bar宽度  narrow:窄bar宽度
    {type:"qrcode",content:"lyen-bdc|unitmes-nanjing|88c7f2332f795d94bc5fb96e17995e5b",y:450,x:400, tolerant: 'L', cellWidth: 4, mode: 'A',rotate: 0}, //打印二维码  x: 起点X; y:起点Y; content:二维码数据   tolerant:容错等级(L M H Q) cellWidth: 单元宽度  mode: 手动M/自动编码A  rotate:旋转角度(0 90 180 270)
    {type:"image",content:"data:image/png;base64xxxxxxx",y:450,x:400,width: 120, height:120}, //打印图片,x: 起点X; y:起点Y; content:base64格式图片数据   width:宽度  height:高度
    {type:"print", x:1,y:1}  //x:打印多少组  y: 每组打印多少份
  ]
}

隐私、权限声明

1. 本插件需要申请的系统权限列表:

Android:需要授予蓝牙权限 IOS:不支持

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问