更新记录
v1.0.9(2022-03-18)
增加barCode的displayCode隐藏功能
v1.0.8(2021-09-28)
1.支持语音播报,中英文 2.震动手机
v1.0.7(2021-05-08)
修复偶发性bug,打印34报错
查看更多平台兼容性
Android | Android CPU类型 | iOS |
---|---|---|
适用版本区间:5.0 - 9.0 | armeabi-v7a:支持,arm64-v8a:支持,x86:支持 | × |
原生插件通用使用流程:
- 购买插件,选择该插件绑定的项目。
- 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
- 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
- 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
- 开发完毕后正式云打包
付费原生插件目前不支持离线打包。
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原生插件配置”->”云端插件“列表中删除该插件重新选择
前言
此文档供有 uni-app 开发经验的人阅读。当 uni-app 需要调用 A980 手持打印机的时候,需要用到我们原生插件包。使用自定义基座打包生成 APP。
说明,本程序运行在手持设备 A980 的手持打印机上,普通安卓设备运行,会报错,打印失败:16
没有废话,直奔主题,上代码
第一步:导入
// 获取 module
var printModule = uni.requireNativePlugin("lianjiao-pda")
第二步:测试
先初始化,否则偶发性报错34,在onload里APP启动时候就直接调用。
printModule.init((ret) => {
uni.showToast({
title: ret,
duration: 2000
});
});
测试打印
printModule.sendControlCommand({
"name": "test"
},(ret) => {
modal.toast({
message: ret,
duration: 1.5
});
});
第三步:自定义打印内容
var printData = {
"name": "printCustom",
"data": {
"preview":false,
"width":384,
"height":260,
"qrcode": {
"text": "1234567890",
"width": 140,
"height": 140,
"left": 0,
"top": 0
},
"barcode": {
"text": "1234567890",
"width": 345,
"height": 60,
"left": 0,
"top": 120
},
"texts": [{
"text": "货品编号:1234567890",
"size": 20,
"x": 25,
"y": 240,
"bold": true
}]
}
}
printModule.sendControlCommand(printData,(ret) => {
modal.toast({
message: ret,
duration: 1.5
});
});
自定义打印模块说明
当发送的对象 name 为 printCustom 的时候,则为自定义模版打印。这个时候 data 必须有数据,数据有三个属性 qrcode,barcode 和 texts。qrcode 是二维码,barcode 是条形码,texts 是文字,文字需要自己计算换行。设备不会自动换行。根据需要设定自己的打印内容。
width:打印区域宽度;
height:打印区域高度;
| 字段 | 说明 | | data.preview | 是否为预览 | | data.qrcode | 二维码 | | data.barcode | 条形码 | | data.texts | 文字列表 | | data.width | 打印区域宽度 | | data.height | 打印区域高度 | | data.texts[0].x | x 坐标 | | data.texts[0].y | y 坐标 | | data.texts[0].bold | 是否加粗 |
第四步:打印图片
图片是以 base64 的格式发送给打印机的
printModule.sendControlCommand({
"name": "printImage",
"data":{
"concentration":25,//打印浓度
"img":"xxx"//此处为base64转码后的图片,因为uni的md文档解析有bug,所以在这里不放base64转码后的字符了
}
},(ret) => {
uni.showToast({
title: ret,
duration: 2000
});
});
图片打印模块说明
当发送的对象 name 为 printImage 的时候,则为图片格式打印。这个时候,img 里为图片的 base64 编码的图片信息。concentration 为打印浓度。默认为 25,可不处理。
第五步:退纸与进纸
改变标签纸的位置,适当进行退纸或者进纸,也可以在每次打印完之后调用一下,方便撕纸。
movePaper(param){
//param "1B4Axx":进纸; "1B4Bxx":退纸; xx:步幅
printModule.sendControlCommand({
'name': 'movePaper',
'data':param
},(ret) => {
uni.showToast({
title: ret,
duration: 2000
});
});
}
第六步:混合打印
当需要打印的内容跟超时购物小票一样的时候,可以选择混合打印。这种打印方式比较适合类似清单那种,文字居多,长篇幅的打印。
printModule.sendControlCommand({
'name': 'printMix',
'data':[{
printType:0,
text:"收 银 凭 据\n",
textSize:"2x",
alignment:"middle"
},{
text:"时间: 2016-11-15 16:00\n"
},{
text:"操作员: admin\n"
},{
text:"收据单号:1234567890\n"
},{
text:"编号 数量 单价 折扣 小计\n"
},{
text:"-----------------------------\n"
},{
text:"A920 1 1200 0 1200\n"
},{
text:"A921 1 1300 0 1300\n"
},{
text:"A930 1 1400 0 1400\n"
},{
text:"-----------------------------\n"
},{
text:"共销售数量: 3 \n"
},{
text:"售价合计(RMB): 8800\n"
},{
text:"实收金额(RMB): 10000\n"
},{
text:"找零金额(RMB): 1200\n"
},{
text:"\n"
},{
text:"-----------------------------\n"
},{
text:"支付方式: 微信支付 \n"
},{
text:"欢迎下次光临 请保留好小票!\n"
},{
text:"-----------------------------\n"
},{
text:" 谢谢惠顾\n",
textSize:"2x"
},{
text:"\n"
},{
printType:1,
text:"1234567890",
width:300,
height:60,
displayCode:true,
left:30
},{
textSize:"1x",
text:"\n 扫一扫下载APP更多优惠\n"
},{
text:"\n\n"
},{
printType:2,
text:"1234567890",
width:300,
height:300,
left:100
},{
text:"\n1个月之内可凭票至服务台开具发票!\n"
},{
text:"\n\n"
},{
text:"\n\n\n"
}]
},(ret) => {
uni.showToast({
title: ret,
duration: 2000
});
});
第七步:检测黑标
当打印完成后,如果是不干胶打印的,打印完一个之后没有走到退纸位置,则可以调用检测黑标,则会调用检测方法,走纸到下一个标签开始位置。如果觉得撕纸还是不方便,可以再手动走纸一个单位。 记得黑标检测应该再打印完成事件触发回调之后再调用。
printModule.sendControlCommand({
'name': 'checkBlack'
},(ret) => {
uni.showToast({
title: ret,
duration: 2000
});
});
第七步:语音播报
具体使用还请参见示例工程
printModule.playVoice('失败了');
printModule.playVoice('test');
第八步:震动手机
具体使用还请参见示例工程
//震动时长:单位毫秒,800毫秒
printModule.vibrate(800);