适用场景:
该文档适用于使用蓝牙打印机的打单场景,包括便携式蓝牙打印机和台式蓝牙打印机,如快递上门揽件打单、微商打单等。一般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打印机?
关于认证的蓝牙打印机