网页调用菜鸟打印控件打印电子面单
有一个需求是打印快递 电子面单,试了好多网页控件因为格式问题 都不好用,后来发现菜鸟控件可以直接按标准模板打印的;
菜鸟云打印组件开启本地socket服务,接收客户端命令后转发给打印机输出
交互协议 https://open.taobao.com/doc.htm?docId=107014&docType=1
官方示例 http://cdn-cloudprint.cainiao.com/waybill-print/docs/test/test_print.html
下载地址 https://support-cnkuaidi.taobao.com/docs/doc.htm?treeId=409&articleId=108934&docType=1
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<button onclick="doPrint('2027200037403746')">打印</button>
</body>
<script>
var socket,defaultPrinter;
socket = new WebSocket('ws://127.0.0.1:13528');
// 打开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);
};
};
websocket.onmessage = function (event) {
var response = eval(event.data);
if (response.cmd == 'notifyPrintResult') {
//打印通知
console.log(response.taskID);
if(response.taskStatus == 'printed'){
//打印完成回调 response.printStatus[0].documentID
}
}
};
//打印电子面单
function doPrint(waybillNO){
var request = getRequestObject("print");
request.task = new Object();
request.task.taskID = getUUID(8,10);
request.task.preview = false;
request.task.printer = defaultPrinter;
var documents = new Array();
var doc = new Object();
doc.documentID = waybillNO;
var waybill = getWaybillJson(waybillNO);
doc.contents = waybill;
documents.push(doc);
request.task.documents = documents;
socket.send(JSON.stringify(request));
}
/***
*
* 获取请求的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;
}
/**
* 请求打印机列表
* */
function getPrintList(){
var request = getRequestObject("getPrinters");
if (socket.readyState===1) {
console.log(request)
socket.send(JSON.stringify(request));
}
}
//获取运单数据 waybillNO 电子面单号
function getWaybillJson(waybillNO){
var ret = {
content: [
{
"data": {
"_dataFrom": "waybill",
"cpCode": "SHENTONG",
"needEncrypt": false,
"parent": false,
"recipient": {
"address": {
"city": "武汉市",
"detail": "东湖路112号",
"district": "武昌区",
"province": "湖北省"
},
"mobile": "13100000000",
"name": "张三"
},
"routingInfo": {
"consolidation": {
"code": "E30",
"name": "中转集"
},
"routeCode": "327 E70 000",
"sortation": {
"name": "E70"
}
},
"sender": {
"address": {
"city": "太原市",
"detail": "太榆路185号",
"district": "小店区",
"province": "山西省"
},
"mobile": "15500000000",
"name": "李四"
},
"shippingOption": {
"code": "STANDARD_EXPRESS",
"title": "标准快递"
},
"waybillCode": "2027200037403746"
},
"templateURL": "http://cloudprint.cainiao.com/template/standard/288948/7"
},
{
"data": {
"tradeInfo": "图书画册 * 3"
},
"templateURL": "http://cloudprint.cainiao.com/template/standard/313049/6"
}
]
};
return ret.content;
}
</script>
</html>

浙公网安备 33010602011771号