Printer

标准ES-POS命令打印,固定IP或蓝牙打印,支持黑白图片打印

预览


项目

Github
Bintray

要求

  • minSdkVersion 5
  • <uses-permission android:name="android.permission.INTERNET" />
  • <uses-permission android:name="android.permission.BLUETOOTH" />

引用

dependencies {⋯compile 'am.util:printer:2.0.0'⋯
}

详情

  • 实现PrintDataMaker接口来实现打印任务
  • 继承PrinterWriter来实现更多纸张类型的打印
  • PrinterUtils包含了众多打印指令

使用

1.添加蓝牙权限<uses-permission android:name="android.permission.BLUETOOTH" />或者网络请求权限<uses-permission android:name="android.permission.INTERNET" />

2.实现PrintDataMaker接口,完成具体打印任务:

public class TestPrintDataMaker implements PrintDataMaker {private Context context;private String qr;private int width;private int height;public TestPrintDataMaker(Context context, String qr, int width, int height) {this.context = context;this.qr = qr;this.width = width;this.height = height;}@Overridepublic List<byte[]> getPrintData(int type) {ArrayList<byte[]> data = new ArrayList<>();try {PrinterWriter printer;printer = type == PrinterWriter58mm.TYPE_58 ? new PrinterWriter58mm(height, width) : new PrinterWriter80mm(height, width);printer.setAlignCenter();data.add(printer.getDataAndReset());ArrayList<byte[]> image1 = printer.getImageByte(context.getResources(), R.drawable.ic_printer_logo);data.addAll(image1);printer.setAlignLeft();printer.printLine();printer.printLineFeed();printer.printLineFeed();printer.setAlignCenter();printer.setEmphasizedOn();printer.setFontSize(1);printer.print("我的餐厅");printer.printLineFeed();printer.setFontSize(0);printer.setEmphasizedOff();printer.printLineFeed();printer.print("最时尚的明星餐厅");printer.printLineFeed();printer.print("客服电话:400-8008800");printer.printLineFeed();printer.setAlignLeft();printer.printLineFeed();printer.print("订单号:88888888888888888");printer.printLineFeed();printer.print("预计送达:" +new SimpleDateFormat("yyyy/MM/dd HH:mm", Locale.getDefault()).format(new Date(System.currentTimeMillis())));printer.printLineFeed();printer.setEmphasizedOn();printer.print("#8(已付款)");printer.printLineFeed();printer.print("××区××路×××大厦××楼×××室");printer.printLineFeed();printer.setEmphasizedOff();printer.print("13843211234");printer.print("(张某某)");printer.printLineFeed();printer.print("备注:多加点辣椒,多加点香菜,多加点酸萝卜,多送点一次性手套");printer.printLineFeed();printer.printLine();printer.printLineFeed();printer.printInOneLine("星级美食(豪华套餐)×1", "¥88.88", 0);printer.printLineFeed();printer.printInOneLine("星级美食(限量套餐)×1", "¥888.88", 0);printer.printLineFeed();printer.printInOneLine("餐具×1", "¥0.00", 0);printer.printLineFeed();printer.printInOneLine("配送费", "免费", 0);printer.printLineFeed();printer.printLine();printer.printLineFeed();printer.setAlignRight();printer.print("合计:977.76");printer.printLineFeed();printer.printLineFeed();printer.setAlignCenter();data.add(printer.getDataAndReset());String bitmapPath = FileUtils.getExternalFilesDir(context, "Temp") + "tmp_qr.jpg";if (QRCodeUtil.createQRImage(qr, 380, 380, null, bitmapPath)) {ArrayList<byte[]> image2 = printer.getImageByte(bitmapPath);data.addAll(image2);} else {ArrayList<byte[]> image2 = printer.getImageByte(context.getResources(), R.drawable.ic_printer_qr);data.addAll(image2);}printer.printLineFeed();printer.print("扫一扫,查看详情");printer.printLineFeed();printer.printLineFeed();printer.printLineFeed();printer.printLineFeed();printer.printLineFeed();printer.feedPaperCutPartial();data.add(printer.getDataAndClose());return data;} catch (Exception e) {return new ArrayList<>();}}
}

3.创建打印执行者:

PrintExecutor executor = new PrintExecutor(String ip, int port, int type);
PrintExecutor executor = new PrintExecutor(BluetoothDevice device, int type);

4.设置执行者状态监听:

executor.setOnStateChangedListener(new PrintSocketHolder.OnStateChangedListener() {@Overridepublic void onStateChanged(int state) {switch (state) {case PrintSocketHolder.STATE_0://生成打印页面数据...break;case PrintSocketHolder.STATE_1://生成数据成功,开始创建Socket连接...break;case PrintSocketHolder.STATE_2://创建Socket成功,开始获取输出流...break;case PrintSocketHolder.STATE_3://获取输出流成功,开始写入打印页面数据...break;case PrintSocketHolder.STATE_4://写入打印页面数据成功,正在完成打印...break;}}
});

4.设置执行者回调监听:

executor.setOnPrintResultListener(new PrintExecutor.OnPrintResultListener() {@Overridepublic void onResult(int errorCode) {switch (errorCode) {case PrintSocketHolder.ERROR_0://打印成功完成!break;case PrintSocketHolder.ERROR_1://生成打印页面数据失败!break;case PrintSocketHolder.ERROR_2://创建Socket失败!break;case PrintSocketHolder.ERROR_3://获取输出流失败!break;case PrintSocketHolder.ERROR_4://写入打印页面数据失败!break;case PrintSocketHolder.ERROR_5://必要的参数不能为空!break;case PrintSocketHolder.ERROR_6://关闭Socket出错break;case PrintSocketHolder.ERROR_100://打印失败break;}}
});

5.执行打印:

int result = executor.doPrinterRequest(PrintDataMaker maker);//同步
executor.doPrinterRequestAsync(PrintDataMaker maker);//异步

如果你要实现自己的打印机PrinterWriter,那么你需要继承

public class PrinterWriter80mm extends PrinterWriter {public static final int TYPE_80 = 80;// 纸宽80mmpublic int width = 500;public PrinterWriter80mm() throws IOException {}public PrinterWriter80mm(int parting) throws IOException {super(parting);}public PrinterWriter80mm(int parting, int width) throws IOException {super(parting);this.width = width;}@Overrideprotected int getLineWidth() {//一行能够放下多少个“-”return 24;}@Overrideprotected int getLineStringWidth(int textSize) {//根据字体的大小,一行可以放下多少个英文字符switch (textSize) {default:case 0:return 47;case 1:return 23;}}@Overrideprotected int getDrawableMaxWidth() {//图片能够全部打印在纸上的最大宽度return width;}
}

注意

  • 打印图片出现乱码或者打印不出,大部分原因是打印机缓存较小导致,可调小PrinterWriter80mm的parting参数,设置其图片高度分割值(0~255),调小了还不行的话,缩小图片尺寸或者调整输出流的写入方式。
  • 仅提供建立蓝牙连接打印,不包括蓝牙搜索及配对功能
  • 不包含二维码生成功能

历史

  • 1.1.4说明
  • 1.1.3
  • 1.1.2
  • 1.1.1
  • 1.1.0
  • 1.0.0

[Widget]Android小票打印,蓝牙打印、固定IP打印、黑白图片打印相关推荐

  1. s5pv210 android 4.0.4 设置固定ip移植

    由于工作要求移植4.0.4android的设置固定ip,所以安下心看看了看调用关系如下,但是函数调用接口变了只能是自己改了, android2.3调用关系 android2.3 packages/ap ...

  2. Android 蓝牙/wifi云打印机 ESC/POS热敏打印机打印(ESC/POS指令篇)

    上一篇主要介绍了如何通过蓝牙打印机和wifi云打印机的连接与数据发送,这一篇,我们就介绍向打印机发送打印指令,来打印字符和图片. 由于公司暂且买了两台打印机,一台佳博GP-58MIII,一台GP-SH ...

  3. 如何锁定计算机的打印功能,打印机设置固定IP的详细图形教程

    在计算机上设置打印机共享通常不如在"右键菜单"上共享那样简单. 在共享过程中会遇到很多问题. 大量问题是由Windows安全机制引起的. 解决后,"共享"将没有 ...

  4. 小程序蓝牙打印机CPCL图片打印问题梳理

    小程序蓝牙打印机CPCL指令图片打印问题梳理 本文以汉印HM-T3便携式打印机示例讲解 手册中要求需要用ASCII码十六进制字符下发命令,源引自 有赞零售小票打印跨平台解决方案 图片处理 由于 JS ...

  5. ip登录打印机怎么打印_不要打印,登录。

    ip登录打印机怎么打印 Often on Python, especially as a beginner, you might print( ) a variable in order to see ...

  6. Android官方开发文档Training系列课程中文版:打印内容之图像打印

    原文地址:http://android.xsoftlab.net/training/printing/index.html 引言 Android用户会很频繁的浏览设备上的内容,但是有部分情况例外,当屏 ...

  7. php 只打印某个区域,PHP打印代码页面固定区域

    在使用PHP软件的朋友们肯定碰上过没有打印代码的情况!PHP打印代码页面固定区域让您在这里直接输入代码就能解决问题啦!想要继续打印工作的话您可以使用狂飙php最新版和PHP开发课安卓版中进行了解!PH ...

  8. Android官方开发文档Training系列课程中文版:打印内容之自定义文档打印

    原文地址:http://android.xsoftlab.net/training/printing/custom-docs.html 对于一些应用,比如绘图类APP,版面设计类APP以及其它APP, ...

  9. 条码打印软件如何固定二维码的尺寸和位置

    用过条码打印软件的小伙伴会知道,在软件中生成二维码后,可以直接在画布上用鼠标拖动二维码,改变二维码位置,也可以用鼠标拖动二维码四个角方形点修改二维码尺寸,设置是非常灵活. 但是也有的客户用条码打印软件 ...

最新文章

  1. 一分钟在Linux环境下创建一台SFTP服务器(含账户创建)
  2. 什么是SAP重复性生产
  3. MacBook Air m1的内存
  4. aspnet登录界面代码_SPA+.NET Core3.1 GitHub第三方授权登录
  5. Java实现Huffman哈夫曼树
  6. (2)FPGA开发流程介绍(第1天)
  7. 1月第4周安全回顾 移动安全受关注 ***威胁公共设施
  8. 转: 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
  9. Altium Designer简明教程:如何创建元件库并绘制库元件(图文教程)
  10. 进销存excel_干货分享,上班族必看。EXCEL轻松搞定制作进销存报表
  11. 决策树和随机森林预测员工离职率学习代码
  12. Matlab 中 residuez函数的使用
  13. Ajax 改造,第 3 部分: 用 jQuery、Ajax 选项卡和照片 carousel 改进现有的站点
  14. 当Android开发遇到魅族手机
  15. Adobe国际认证设计师含金量,能否代表设计师的真实水平?
  16. 如何将PDF批量转成JPG?
  17. php 正方,用php的CURL模拟登录正方教务系统
  18. windows下golang监控鼠标和键盘事件
  19. 传奇单机架设教程 小白也能开传奇
  20. mysql查询数据量

热门文章

  1. 基于javaweb的小区停车收费系统-计算机毕业设计
  2. 2019中国(北京)国际智慧建筑装备展览会
  3. Vue电商项目—订单管理—订单列表模块-10
  4. 企业纷纷迈入数字化转型之路,未来五年数字化发展的趋势是什么?
  5. Linux 服务器安装配置
  6. L11.盛最多水的容器
  7. 猜猜这是icpc20年那一场的a题,高斯消元re
  8. 智慧停车场-车牌识别自动计费系统
  9. python粒子群算法的实现
  10. 基于大数据spark+hadoop的图书可视化分析系统