相关文章推荐

适用场景:
该文档适用于使用蓝牙打印机的打单场景,包括便携式蓝牙打印机和台式蓝牙打印机,如快递上门揽件打单、微商打单等。一般ISV打单软件形态以移动端App、微信/支付宝小程序等。

菜鸟:
1)提供各家快递公司的标准菜鸟电子面单模板;
2)提供打印机能识别指令集的云端渲染服务,即可将模板与打印数据转换成打印机能识别的指令集;

ISV:
1)如若需要自定义区,则自定义区模板需要由ISV来设计给出
2)打单软件通过对接菜鸟云打印服务获取指令集,并转发给便携式打印机进行打印

打印流程图

接入流程同 ISV或自研商家接入流程

打印机与指令集

目前支持已实现CPCL协议的便携式蓝牙打印机接入。

已认证打印机

【蓝牙打印机】(通过云打印交互协议获取完整的打印机名字。匹配规则按照以下表格,前面必须全部匹配。例如QR-380A必须全匹配,可以是QR-380A123)

XP-D4601B、XP-D4602B、XP-D4603B、XP-DT108、XP-DT108B、XP-DT325B、XP-DT425B、XP-DT426B、XP-P323B、XP-P324B、XP-D3601B、XP-D3602、XP-D3603B、XP-P3301B、XP-P3304B、XP-P4401B、XP-365B、XP-410B、XP-420B、XP-430B、XP-450B、XP-460B、XP-470B、XP-480B、XP-490B DL-750 TL31 Printer、TL51 Printer、TL54 Printer、TL301 Printer、L31 BT Printer、L36 Printer、L51 BT Printer PDD-150BT、PDD-180BT、DLK-500BT、DLK-520BT X30、X35、C30、OP380 CB-W300BT 蓝韵达T1 请联系我们

标准电子面单模板(菜鸟提供)

目前主流快递公司都支持。模板地址请通过接口**cainiao.cloudprint.stdtemplates.get**或**CLOUDPRINT_STANDARD_TEMPLATES**获取

自定义区模板(目前仅支持ISV提供的预设自定义区)

请参考 云打印接入概述 ,在此不作叙述

模板元素支持度

鉴于标准指令集协议的功能支持范围,云打印提供的指令集渲染服务实现了原打印组件(桌面型打印机)全功能的子集,具体功能点支持见下表格:

支持字体大小、行高等设置
支持粗体、下划线样式
支持文本按宽度自动换行
支持水平(左/中/右)和纵向(上/中/下)的对齐方式
支持文本以90°/180°/270°旋转,旋转时以文本框中心点为旋转点
正常文本(未作旋转)支持黑底白字显示
有透明度文本会使用EG/CG指令用图片方案代替 支持线条宽度设置
线条样式仅支持实线,不支持虚线、点线等定制 支持边框宽度设置
仅支持黑边白底,不支持填充 条码类型支持128
支持以中心点作90°旋转
不支持条码文字显示 二维码支持QRCode 不支持旋转
因部分手机系统蓝牙传输较慢,不建议在模板上添加图片 表格线条支持展示与否设置
表格内支持其他元素展示

云端接口接入

通过该服务,可将打印请求转换成CPCL打印机能识别的指令集。

注意:
- 请注意API中的printerName请使用型号列表中的打印机名称作为前缀传入(一般情况下都是打印机的蓝牙名称,但有部分打印机可能没法根据蓝牙名称区分型号,需要ISV自行转换名称传入),API会根据打印机名称自动转换相应协议的指令集。
- 现在标准面单打印全部采用密文方式,具体信息可参考上方具体接口文档或者浏览 电子面单一致性改造白皮书

/* 打印天天快递标准便携模板 */
    "clientId":"100001", // 客户端用户标识,请传入客户端唯一用户标识
    "clientType":"weixin", // 客户端类型,native-本地应用 weixin-微信小程序 alipay-支付宝小程序
    "document":{
        "contents":[
          "ver": "waybill_print_secret_version_1",
          "encrypted": true,
          "signature": "MD:8jyWc0A8m/4CkO9bw9oqHA==",
          "addData": "",
          "printData": "AES:rU904rj6UH2oqfSUb43+Z+XlOkZaULeerkScS5xbmfjZC78uvsMTa3g6l33hRAz/srsk0TObjJaJI5n4tAPV1uv7szIPQGPDhwD6MK+zvTVIfuQCMC8p+cUB5S4FmqDhNE45LRVAlaoaI5YK8QmWK1WorhwnPxOFH4Ws/ApobtzDLDJaW6uu1AMEdAejEhRTWL3B1fRhhcDxc3gX+DZF9jJUB++fb9JZqmocWRu0Fvi/b1BokQx7Xt/N+FpJVRI0//NNUQ9b/W4tqGFIbf2IM/Ez1S5hBru5gKGdFzs99ZgCKqtWa0DnOzrZDXroU1mhurtlulE8QbipInu63fkIwn3h9ZSK0sMyV5Jrk5x3MIJDHeW9pc/Tw4TnKTAU134jl+GbbpYysa0+jBARWRjombeKIFSVfp/zgp15jClClUU1Nz4alTi22LimY2qteQRG6G/rCHiYxPoBRdrtqZZxNSdnKG5yjSdtA2CEL1DJNg1QkFVSSsOuqcHLdrKl6oMR+aUN6wM3GQikmKSU/CH4hWCCXxFaJXvBYoSxZ63GrM/d+l6D4+9+rCxHJoEVsa2E1TMHLUOnN6CweSM+45lcBK19bbCUJDyky6nb1NbxrZGYhmfkrNzE2GN+Cz4iTAgxJlQxd1gVvS4v5nB7qNfb0Uhy9NTopdumxOS7NXFFg3RFdBfAJ0nLGnxECUvUihBC3pwsLGimrUnIF4174m6J6O/WUr4PKHiNSva4FIYDc5AiLep/2KknPgxz4mWrxEagjGoDhcwLnJOD1FZJNPOS/9G8DDAhdziRUrPyBjTPWFeYyLM8bl1Cvw+ienE39BmdEwKUsJqQaLDujASEBofN39JJCCAZpk2frh4UlxUET7q+6HtZ+IX8JRl7i+g7lLCC5V0i9eT99fUPTAlNELg8dLmyToH98XwkH6jsW3uGun/ZMmw/nr9qDItRn6/564I08gwav5lhhKDx2Xuu+JZacaxchcGcnta9pGm4i/Cj4chvzxksWtQ4gHRfAETTJnit/1Lxalxb1sDebTS2ZKMpECYHbQNguCw9zOsQJDC3aC2Kobgpl28zE+mgwQLVFftvAWeQg0ZvE7yf97hMv3I01LVwrEWbBhmdrO2/dQowi7M=",
          "class": "com.cainiao.cloudprint.service.dto.RenderContent",
          "templateUrl": "http://cloudprint.cainiao.com/template/standard/101"
                "printData":"{\"other\": \"自定义打印数据\"}",
                "templateUrl":"http://cloudprint.cainiao.com/template/standard/235629" // 该模板为自定义区模板,需要由ISV或商家来编辑提供
    "printerName":"KM-300S-EB13",
    "config":{
        "needTopLogo":"false", // 快递公司头部Logo是否展示
        "needMiddleLogo":"false", // 快递公司中间Logo是否展示
        "needBottomLogo":"false", // 快递公司底部Logo是否展示
        "orientation":"normal",  // normal-正常打印 reverse-旋转180°打印(用于反向出纸的纸张规格)
		"extra": {
  			"watermark":"false" // 是否开启水印:默认为false
    "cmdContent":"xxx",
    "success":"true",
    "cmdEncoding":"gzip",
    "errorCode":"0",
    "errorMsg":""
 
  • success和errorCode:
    success=true时,cmdContent有值,客户端需要按cmdEncoding进行cmdContent的处理
    errorCode=0表示成功,其他表示异常,具体异常可见异常返回信息

  • cmdEncoding:
    由于过大的指令集会影响网络带宽,因此云端会针对指令集的大小考虑是否作gzip压缩。
    1)gzip压缩:需要调用方先作base64解码,然后再做gzip解压,才能拿到指令串;
    2)origin未压缩:返回的直接是指令串;

  • // 伪代码见下
    if (result.isSuccess()) {
    	String cmdEncoding = result.getCmdEncoding();
    	String cmdContent = result.getCmdContent();
    	byte[] cmdBytes = null;
    	if ("origin".equals(cmdEncoding)) {
    		// cmdContent为指令串
    	} else if ("gzip".equals(cmdEncoding)) {
    		// 需要对cmdContent进行base64解码及gzip解压操作。base64和gunzip为标准实现。 
    		cmdBytes = gunzip(base64Decoding(cmdContent));
    	} else {
    		// 为以后可能新加的内容形态预留分支
    	if (cmdBytes != null && cmdBytes.length > 0) {
      		// 返回App或小程序并转发便携式打印机
     * base64串转bytes
     * @param base64Str
     * @return
    public static byte[] base64Decoding(String base64Str) {
    	return Base64.getDecoder().decode(base64Str);
     * gzip解压缩
     * @param compressed
     * @return
    public static byte[] gunzip(byte[] compressed) {
    	if (compressed == null || compressed.length == 0) {
    		return null;
    	ByteArrayOutputStream out = new ByteArrayOutputStream();
    	ByteArrayInputStream in = null;
    	GZIPInputStream ginzip = null;
    	byte[] decompressed = null;
    	try {
    		in = new ByteArrayInputStream(compressed);
    		ginzip = new GZIPInputStream(in);
    		byte[] buffer = new byte[1024];
    		int offset = -1;
    		while ((offset = ginzip.read(buffer)) != -1) {
    			out.write(buffer, 0, offset);
    		decompressed = out.toByteArray();
    	} catch (IOException e) {
    		e.printStackTrace();
    	} finally {
    		closeQuietly(ginzip);
    		closeQuietly(in);
    		closeQuietly(out);
    	return decompressed;
    public static void closeQuietly(InputStream input) {
        try {
            if (input != null) {
                input.close();
        } catch (IOException ioe) {
            // ignore
    public static void closeQuietly(OutputStream output) {
        try {
            if (output != null) {
                output.close();
        } catch (IOException ioe) {
            // ignore
    							                         	                    		

    菜鸟是否支持N31BT-4C60打印机?

    关于认证的蓝牙打印机

     
    推荐文章