H5实现打印电子面单(淘宝菜鸟物流)

介绍:为了对接菜鸟物流,写的测试demo,最终需要实现and design pro版本
效果如图:
在这里插入图片描述
第一步:

先看文档=>菜鸟文档:接口文档

第二步:
下载云打印客户端:打印组件,安装打开就完了
在这里插入图片描述
第三步:
配置打印机:装驱动,设置为默认打印机(面单打印机),完事儿!

第四步:

注意:
如遇打印报【渲染失败】、【出现打印提示框】或者【打印暂停】,
1.重装一下驱动,
2.重启电脑,
3.cainiao打印组件中,选择工具-清楚缓存,然后再选择-重启cainiao组件 (我试了1和2都没解决,使用3解决的)

源代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<div onclick="getdd()">
			打印
		</div>
	</body>
	<script>var socket;
var getdd
var jsonObject = {
	content: {
		"data": {
			"_dataFrom": "waybill",
			"cpCode": "YUNDA",
			"needEncrypt": false,
			"parent": false,
			"recipient": {
				"address": {
					"city": "南京市",
					"detail": "xxx路333113号",
					"district": "南宁区",
					"province": "江苏省"
				},
				"mobile": "15023533341256",
				"name": "王大鹏",
				"phone": "150233333541256"
			},
			"routingInfo": {
				"consolidation": {
					"code": "J210039",
					"name": "南京市内包"
				},
				"origin": {
					"code": "455387",
					"name": "河南安阳公司安钢南分部"
				},
				"routeCode": "B003 000",
				"sortation": {
					"name": "470"
				}
			},
			"sender": {
				"address": {
					"city": "安阳市",
					"detail": "安钢六区",
					"district": "殷都区",
					"province": "河南省"
				},
				"mobile": "02221-61223829958",
				"name": "23424234项目组",
				"phone": "032321-3234525235"
			},
			"shippingOption": {
				"code": "STANDARD_EXPRESS",
				"title": "标准快递"
			},
			"waybillCode": "3738460008834"
		},
		"signature": "MD:C1b9cw46jbUP6/O2rl77Vg==",
		"templateURL": "http://cloudprint.cainiao.com/template/standard/401/177"
	}
}
var num= [{
            waybillCode:"3738460008834",
            printData:{
                data:'',
                templateURL:'http://cloudprint.cainiao.com/template/standard/101/123'
            },
            objectId:"1"
    	}]
var defaultPrinter
//备注:webSocket 是全局对象,不要每次发送请求丢去创建一个,做到webSocket对象重用,和打印组件保持长连接。
//		function doConnect()
//		{
		    socket = new WebSocket('ws://127.0.0.1:13528');
		    //如果是https的话,端口是13529
		    //socket = new WebSocket('wss://localhost:13529');
		    // 打开Socket
		    socket.onopen = function(event)
		    {
		    	getPrintList()//打印机列表
		        // 监听消息
		        socket.onmessage = function(event)
		        {
		            console.log('Client received a message',event);
		            console.log(JSON.parse(event.data).defaultPrinter)
		            defaultPrinter = JSON.parse(event.data).defaultPrinter
		        };
		        // 监听Socket的关闭
		        socket.onclose = function(event)
		        {
		            console.log('Client notified socket has closed',event);
		        };
		    };
//		}
//		doConnect()
getdd = function(){
					doPrint(defaultPrinter,num)
				}

		/***
		 * 
		 * 获取请求的UUID,指定长度和进制,如 
		 * getUUID(8, 2)   //"01001010" 8 character (base=2)
		 * getUUID(8, 10) // "47473046" 8 character ID (base=10)
		 * getUUID(8, 16) // "098F4D35"。 8 character ID (base=16)
		 *   
		 */
		function getUUID(len, radix) {
		    var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
		    var uuid = [], i;
		    radix = radix || chars.length; 
		    if (len) {
		      for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
		    } else {
		      var r;
		      uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
		      uuid[14] = '4';
		      for (i = 0; i < 36; i++) {
		        if (!uuid[i]) {
		          r = 0 | Math.random()*16;
		          uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
		        }
		      }
		    }
		    return uuid.join('');
		}
		/***
		 * 构造request对象
		 */
		function getRequestObject(cmd) {
		    var request  = new Object();
		    request.requestID=getUUID(8, 16);
		    request.version="1.0";
		    request.cmd=cmd;
		    return request;
		}
		/***
		 * 获取自定义区数据以及模板URL
		 * waybillNO 电子面单号
		 */
		function getCustomAreaData(waybillNO){
		    //获取waybill对应的自定义区的JSON object,此处的ajaxGet函数是伪代码
		    //var jsonObject = {jiade:1234}//ajaxGet(waybillNO);
		    var ret = new Object();
		    ret.templateURL=jsonObject.content.templateURL;
		    ret.data=jsonObject.content.data;
		    return ret;
		}
		/***
		 * 获取电子面单Json 数据
		 * waybillNO 电子面单号
		 */
		function getWaybillJson(waybillNO){
		    //获取waybill对应的json object,此处的ajaxGet函数是伪代码
		   // var jsonObject = {jiade:1234}// ajaxGet(waybillNO);
		    return jsonObject;
		}
		/**
		 * 请求打印机列表demo
		 * */
		function getPrintList(){
			var request  = getRequestObject("getPrinters");
		
			if (socket.readyState===1) {
				console.log(request)
		        socket.send(JSON.stringify(request));
		    }
		}
		/**
		 * 弹窗模式配置打印机
		 * */
		function getPrintInPop(){
			var request  = getRequestObject("printerConfig");
		
			if (socket.readyState===1) {
				console.log(request)
		        socket.send(JSON.stringify(request));
		    }
		}
		
		
		/**
		 * 打印电子面单
		 * printer 指定要使用那台打印机
		 * waybillArray 要打印的电子面单的数组
		 */
		
		function doPrint(printer, waybillArray)
		{
		    var request = getRequestObject("print");    
		    request.task = new Object();
		    request.task.taskID = getUUID(8,10);
		    request.task.preview = false;
		    request.task.printer = printer;
		    var documents = new Array();
		    for(i=0;i<waybillArray.length;i++) {
		         var doc = new Object();
		         doc.documentID = waybillArray[i];
		         var content = new Array();
		         var waybillJson = getWaybillJson(waybillArray[i]);
		         var customAreaData = getCustomAreaData(waybillArray[i]);
		         content.push(waybillJson,customAreaData);
		         doc.contents = content;
		         documents.push(doc);
		    }
		    request.task.documents = documents
		    socket.send(JSON.stringify(request));
		}
		/**
		 * 响应请求demo
		 * */
		socket.onmessage = function (event) {   
		    var response = eval(event.data);
		    if (response.cmd == 'getPrinters') {
		        getPrintersHandler(response);//处理打印机列表
		    } else if (response.cmd == 'printerConfig') {
		        printConfigHandler(response);
		    } 
		};
		
		
		
		
	</script>
</html>

备注:修改纸张大小,只能从菜鸟后台配置一联二联三联(https://fahuo.cainiao.com),前端操作不了。
结尾:测试版,对接and design pro 运行成功,等完善了再分享。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: 德佟H5是一种基于HTML5和CSS3技术的移动开发框架,它可以实现跨平台、跨终端的应用程序开发。而在德佟H5中,连接蓝牙打印机是一项非常重要的功能,它可以提高用户的工作效率,方便快捷。接下来我们将详细介绍德佟H5实现连接蓝牙打印的过程。 首先,我们需要了解蓝牙打印机的工作原理。蓝牙打印需要依靠蓝牙协议进行通信,通过蓝牙打印机与设备之间的配对,将数据传输到打印机中,实现打印功能。 在德佟H5中,我们可以通过引入相关的蓝牙插件,来实现蓝牙打印功能。具体实现步骤如下: 1. 在页面中引入蓝牙插件,并初始化蓝牙连接参数。 2. 蓝牙配对成功之后,获取打印机的MAC地址,并将其保存到本地。 3. 打印数据时,先判断本地是否保存了打印机MAC地址,若有,则直接使用此MAC地址进行打印。 4. 将需要打印的数据转换为打印机可读的格式,通过蓝牙协议传输到打印机中。 需要注意的是,在实现连接蓝牙打印的过程中,还需考虑到蓝牙连接的稳定性,以及不同型号的打印机之间可能存在的兼容性问题。因此,在实际应用中,还需进行多次测试和优化,确保蓝牙打印功能实现的准确性和稳定性。 总之,德佟H5实现连接蓝牙打印功能是一项技术含量颇高的任务,但只要掌握了相关的技术原理和实现方法,就能够轻松地实现蓝牙打印功能,提高工作效率,提升用户体验。 ### 回答2: 德佟是一家专注于打印机和扫描仪开发的厂商,他们的H5实现连接蓝牙打印功能可以帮助用户方便快捷地进行无线打印H5是HTML5的简称,它是一种用于开发Web应用的技术。德佟的H5实现连接蓝牙打印功能主要是通过Web蓝牙技术实现的。Web蓝牙技术可以让Web应用程序通过蓝牙接口与设备通信,实现设备控制和数据交换。 德佟的H5实现连接蓝牙打印功能主要包括以下步骤: 1.用户打开打印机的H5页面,点击连接蓝牙打印机按钮。 2.应用程序会扫描附近的蓝牙设备,并列出可选设备列表。用户选择需要连接的打印机设备。 3.应用程序与打印机设备建立蓝牙连接,发送打印任务。 4.打印机接收到打印任务后,开始进行打印操作。 通过德佟的H5实现连接蓝牙打印功能可以帮助用户快速实现打印操作,提高工作效率。同时,它也可以避免使用传统打印机时需要繁琐的纸张预置和连接线设置操作,并且避免了受连接线长度限制的问题,非常方便实用。 ### 回答3: 德佟科技是一家专注于打印应用开发的公司,旗下的德佟云打印服务、德佟打印SDK等都是业内知名的产品。德佟的H5实现连接蓝牙打印,是将H5技术与蓝牙打印技术结合在一起,使得用户可以通过H5页面实现蓝牙打印功能。 具体来说,德佟的H5实现连接蓝牙打印的原理是通过JavaScript调用蓝牙打印SDK,SDK通过与蓝牙打印机建立蓝牙连接,从而实现H5页面向蓝牙打印机发送打印指令的功能。德佟的蓝牙打印SDK支持多种蓝牙打印机品牌和型号,适用于各种场景下的打印需求,且API简单易用,方便开发者在页面中实现蓝牙打印功能。 德佟的H5实现连接蓝牙打印,可以广泛应用于餐饮、物流、医疗等各种行业。比如,在餐饮行业中,用户可以通过手机进行点餐,然后将订单通过蓝牙连接打印打印出来,提高了订单的准确性和工作效率。总之,德佟的H5实现连接蓝牙打印为用户提供了一种方便快捷的打印解决方案,帮助用户实现高效的业务流程和操作。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘斩仙的笔记本

富贵险中求

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值