ESC/POS打印机打印

主要记录一下主要代码
一、设置文字对齐:
mWriter.write(0x1b);
mWriter.write(0x61);
mWriter.write(alignment);// 0:左对齐,1:居中,2:右对齐
二、字体大小
mWriter.write(0x1b);
mWriter.write(0x21);
mWriter.write(30);//传多大显示多大
还有图片等等 直接附上工具类吧:
public class PrintUtil {

private OutputStreamWriter mWriter = null;
private OutputStream mOutputStream = null;public final static int WIDTH_PIXEL = 384;
public final static int IMAGE_SIZE = 320;
private static Map<String, String> mapList = null;/*** 初始化Pos实例** @param encoding 编码* @throws IOException*/
public PrintUtil(OutputStream outputStream, String encoding) throws IOException {mWriter = new OutputStreamWriter(outputStream, encoding);mOutputStream = outputStream;initPrinter();
}public void print(byte[] bs) throws IOException {mOutputStream.write(bs);
}public void printRawBytes(byte[] bytes) throws IOException {mOutputStream.write(bytes);mOutputStream.flush();
}/*** 初始化打印机** @throws IOException*/
public void initPrinter() throws IOException {mWriter.write(0x1B);mWriter.write(0x40);mWriter.flush();
}/*** 打印换行** @return length 需要打印的空行数* @throws IOException*/
public void printLine(int lineNum) throws IOException {for (int i = 0; i < lineNum; i++) {mWriter.write("\n");}mWriter.flush();
}/*** 打印换行(只换一行)** @throws IOException*/
public void printLine() throws IOException {printLine(1);
}/*** 打印空白(一个Tab的位置,约4个汉字)** @param length 需要打印空白的长度,* @throws IOException*/
public void printTabSpace(int length) throws IOException {for (int i = 0; i < length; i++) {mWriter.write("\t");}mWriter.flush();
}/*** 绝对打印位置** @return* @throws IOException*/
public byte[] setLocation(int offset) throws IOException {byte[] bs = new byte[4];bs[0] = 0x1B;bs[1] = 0x24;bs[2] = (byte) (offset % 256);bs[3] = (byte) (offset / 256);return bs;
}public byte[] getGbk(String stText) throws IOException {byte[] returnText = stText.getBytes("GBK"); // 必须放在try内才可以return returnText;
}private int getStringPixLength(String str) {int pixLength = 0;char c;for (int i = 0; i < str.length(); i++) {c = str.charAt(i);if (Pinyin.isChinese(c)) {pixLength += 24;} else {pixLength += 12;}}return pixLength;
}public int getOffset(String str) {return WIDTH_PIXEL - getStringPixLength(str);
}/*** 打印文字** @param text* @throws IOException*/
public void printText(String text) throws IOException {mWriter.write(text);mWriter.flush();
}/*** 对齐0:左对齐,1:居中,2:右对齐*/
public void printAlignment(int alignment) throws IOException {mWriter.write(0x1b);mWriter.write(0x61);mWriter.write(alignment);
}public void printLargeText(String text) throws IOException {mWriter.write(0x1b);mWriter.write(0x21);mWriter.write(30);mWriter.write(text);mWriter.write(0x1b);mWriter.write(0x21);mWriter.write(0);mWriter.flush();
}public void printTwoColumn(String title, String content) throws IOException {int iNum = 0;byte[] byteBuffer = new byte[100];byte[] tmp;tmp = getGbk(title);System.arraycopy(tmp, 0, byteBuffer, iNum, tmp.length);iNum += tmp.length;tmp = setLocation(getOffset(content));System.arraycopy(tmp, 0, byteBuffer, iNum, tmp.length);iNum += tmp.length;tmp = getGbk(content);System.arraycopy(tmp, 0, byteBuffer, iNum, tmp.length);print(byteBuffer);
}public void printThreeColumn(String left, String middle, String right) throws IOException {int iNum = 0;byte[] byteBuffer = new byte[200];byte[] tmp = new byte[0];System.arraycopy(tmp, 0, byteBuffer, iNum, tmp.length);iNum += tmp.length;tmp = getGbk(left);System.arraycopy(tmp, 0, byteBuffer, iNum, tmp.length);iNum += tmp.length;int pixLength = getStringPixLength(left) % WIDTH_PIXEL;if (pixLength > WIDTH_PIXEL / 2 || pixLength == 0) {middle = "\n\t\t" + middle;}tmp = setLocation(192);System.arraycopy(tmp, 0, byteBuffer, iNum, tmp.length);iNum += tmp.length;tmp = getGbk(middle);System.arraycopy(tmp, 0, byteBuffer, iNum, tmp.length);iNum += tmp.length;tmp = setLocation(getOffset(right));System.arraycopy(tmp, 0, byteBuffer, iNum, tmp.length);iNum += tmp.length;tmp = getGbk(right);System.arraycopy(tmp, 0, byteBuffer, iNum, tmp.length);print(byteBuffer);
}public void printDashLine() throws IOException {printText("--------------------------------");
}public void printBitmap(Bitmap bmp) throws IOException {bmp = compressPic(bmp);byte[] bmpByteArray = draw2PxPoint(bmp);printRawBytes(bmpByteArray);
}/************************************************************************** 假设一个360*360的图片,分辨率设为24, 共分15行打印 每一行,是一个 360 * 24 的点阵,y轴有24个点,存储在3个byte里面。* 即每个byte存储8个像素点信息。因为只有黑白两色,所以对应为1的位是黑色,对应为0的位是白色**************************************************************************/
private byte[] draw2PxPoint(Bitmap bmp) {//先设置一个足够大的size,最后在用数组拷贝复制到一个精确大小的byte数组中int size = bmp.getWidth() * bmp.getHeight() / 8 + 1000;byte[] tmp = new byte[size];int k = 0;// 设置行距为0tmp[k++] = 0x1B;tmp[k++] = 0x33;tmp[k++] = 0x00;// 居中打印tmp[k++] = 0x1B;tmp[k++] = 0x61;tmp[k++] = 1;for (int j = 0; j < bmp.getHeight() / 24f; j++) {tmp[k++] = 0x1B;tmp[k++] = 0x2A;// 0x1B 2A 表示图片打印指令tmp[k++] = 33; // m=33时,选择24点密度打印tmp[k++] = (byte) (bmp.getWidth() % 256); // nLtmp[k++] = (byte) (bmp.getWidth() / 256); // nHfor (int i = 0; i < bmp.getWidth(); i++) {for (int m = 0; m < 3; m++) {for (int n = 0; n < 8; n++) {byte b = px2Byte(i, j * 24 + m * 8 + n, bmp);tmp[k] += tmp[k] + b;}k++;}}tmp[k++] = 10;// 换行}// 恢复默认行距tmp[k++] = 0x1B;tmp[k++] = 0x32;byte[] result = new byte[k];System.arraycopy(tmp, 0, result, 0, k);return result;
}/*** 图片二值化,黑色是1,白色是0** @param x   横坐标* @param y   纵坐标* @param bit 位图* @return*/
private byte px2Byte(int x, int y, Bitmap bit) {if (x < bit.getWidth() && y < bit.getHeight()) {byte b;int pixel = bit.getPixel(x, y);int red = (pixel & 0x00ff0000) >> 16; // 取高两位int green = (pixel & 0x0000ff00) >> 8; // 取中两位int blue = pixel & 0x000000ff; // 取低两位int gray = RGB2Gray(red, green, blue);if (gray < 128) {b = 1;} else {b = 0;}return b;}return 0;
}/*** 图片灰度的转化*/
private int RGB2Gray(int r, int g, int b) {int gray = (int) (0.29900 * r + 0.58700 * g + 0.11400 * b); // 灰度转化公式return gray;
}/*** 对图片进行压缩(去除透明度)** @param bitmapOrg*/
private Bitmap compressPic(Bitmap bitmapOrg) {// 获取这个图片的宽和高int width = bitmapOrg.getWidth();int height = bitmapOrg.getHeight();// 定义预转换成的图片的宽度和高度int newWidth = IMAGE_SIZE;int newHeight = IMAGE_SIZE;Bitmap targetBmp = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888);Canvas targetCanvas = new Canvas(targetBmp);targetCanvas.drawColor(0xffffffff);targetCanvas.drawBitmap(bitmapOrg, new Rect(0, 0, width, height), new Rect(0, 0, newWidth, newHeight), null);return targetBmp;
}//数据格式  如:日期:2019-12-04
public static void printTest(Context context, String jsonStr, List<PrintBean> list, BluetoothSocket bluetoothSocket) {try {mapList = null;mapList = GsonUtils.toObject(jsonStr, new TypeToken<Map<String,String>>(){}.getType());if (mapList == null){Toast.showLong(context,"打印数据为空");return;}PrintUtil pUtil = new PrintUtil(bluetoothSocket.getOutputStream(), "GBK");// 店铺名 居中 放大 0:左对齐,1:居中,2:右对齐pUtil.printAlignment(1);pUtil.printLargeText(SPUtils.getCompanyName(context));pUtil.printLine(2);pUtil.printAlignment(1);pUtil.printText(mapList.get("title"));//表单名称pUtil.printLine();pUtil.printAlignment(0);pUtil.printLine();// 分隔线pUtil.printDashLine();pUtil.printLine();if (!TextUtils.isEmpty(mapList.get("date"))) {pUtil.printText(mapList.get("date"));//表单时间pUtil.printLine();}if (!TextUtils.isEmpty(mapList.get("code"))) {pUtil.printText(mapList.get("code"));//表单编号pUtil.printLine();}if (!TextUtils.isEmpty(mapList.get("name"))) {pUtil.printText(mapList.get("name"));//表单主题或者名称pUtil.printLine();}if (!TextUtils.isEmpty(mapList.get("client"))) {pUtil.printText(mapList.get("client").replace("null", ""));//表单客户pUtil.printLine();}if (!TextUtils.isEmpty(mapList.get("contacts"))) {pUtil.printText(mapList.get("contacts").replace("null", ""));//表单联系人pUtil.printLine();}if (!TextUtils.isEmpty(mapList.get("enddate"))) {pUtil.printText(mapList.get("enddate").replace("null", ""));//表单发货日期或者结束日期pUtil.printLine();}if (!TextUtils.isEmpty(mapList.get("possibility"))){pUtil.printText(mapList.get("possibility").replace("null",""));//表单可能性pUtil.printLine();}if (!TextUtils.isEmpty(mapList.get("money"))) {pUtil.printText(mapList.get("money").replace("null",""));//表单金额pUtil.printLine();}if (!TextUtils.isEmpty(mapList.get("emp"))) {pUtil.printText(mapList.get("emp").replace("null", ""));//表单业务员pUtil.printLine();}if (!TextUtils.isEmpty(mapList.get("remark"))) {pUtil.printText(mapList.get("remark").replace("null", ""));//表单摘要或者备注pUtil.printLine();}// 分隔线pUtil.printDashLine();pUtil.printLine();if (list!=null&&list.size()>0){for (int i=0;i<list.size();i++){pUtil.printText(list.get(i).getName());//明细名称pUtil.printLine();pUtil.printAlignment(1);pUtil.printText("   "+list.get(i).getShuliang()+"  "+list.get(i).getDanjia());pUtil.printLine();pUtil.printText("   "+list.get(i).getSuilv()+"  "+list.get(i).getJine());pUtil.printLine();}}pUtil.printAlignment(0);// 分隔线pUtil.printDashLine();pUtil.printLine();if (!TextUtils.isEmpty(mapList.get("total"))) {pUtil.printText(mapList.get("total").replace("null", ""));//表单合计}pUtil.printLine(4);pUtil.printAlignment(1);pUtil.printText("打印人:"+SPUtils.getOperato(context));//打印人pUtil.printLine();pUtil.printText("打印日期:"+DateUtils.getCurrentTime());//打印日期pUtil.printLine();//   pUtil.printDashLine();

//
// pUtil.printBitmap(bitmap);
//
pUtil.printLine(4);

    } catch (IOException e) {}
}//数据格式  如:日期:2019-12-04
public static void printTestLin(Context context, String jsonStr, List<String> list, BluetoothSocket bluetoothSocket) {try {mapList = null;mapList = GsonUtils.toObject(jsonStr, new TypeToken<Map<String,String>>(){}.getType());if (mapList == null){Toast.showLong(context,"打印数据为空");return;}PrintUtil pUtil = new PrintUtil(bluetoothSocket.getOutputStream(), "GBK");// 店铺名 居中 放大 0:左对齐,1:居中,2:右对齐pUtil.printAlignment(1);pUtil.printLargeText(SPUtils.getCompanyName(context));pUtil.printLine(2);pUtil.printAlignment(1);pUtil.printText(mapList.get("title"));//表单名称pUtil.printLine();pUtil.printDashLine();pUtil.printLine();pUtil.printAlignment(0);pUtil.printLine();if (list!=null&&list.size()>0){for (int i=0;i<list.size();i++){pUtil.printText(list.get(i));//明细名称pUtil.printLine();}}pUtil.printLine(4);pUtil.printAlignment(1);pUtil.printText("打印人:"+SPUtils.getOperato(context));//打印人pUtil.printLine();pUtil.printText("打印日期:"+DateUtils.getCurrentTime());//打印日期pUtil.printLine();//   pUtil.printDashLine();

//
// pUtil.printBitmap(bitmap);
//
pUtil.printLine(4);

    } catch (IOException e) {}
}

}

安卓开发ESC/POS打印机打印相关推荐

  1. Android进阶——安卓调用ESC/POS打印机打印

    前言 前一段时间由于工作需要,要研究一下安卓程序调用打印机打印小票,并且要求不能使用蓝牙调用,研究了一下,可以利用socket连接,来实现打印功能.写了个Demo,分享一下. 工具:一台打印机(芯烨X ...

  2. Android sockot连接打印机EPSON ESC/POS指令打印

    sockot连接打印机EPSON ESC/POS指令打印 接了一个需求,需要用Android pad连接打印机进行打印,以前倒是没接触过,这次在网上找了下资料,简单实现了下需求.在这记录下相关代码以及 ...

  3. delphi fmx网口命令方式调用pos打印机打印

    最近用delphi fmx 在做一个pos打印程序, 如果用usb方式打印是挺简单的,以前弄过 用richedit排版好打印就可以了,但麻烦的是必须安装打印机驱动. 于是我选择用网口方式打印. 用网络 ...

  4. iOS 连接打印机 ESC/POS 指令打印 打印图片二维码

    最近公司给商户做的App 允许App把卖出的商品信息通过打印机 打印标签 所以了解了一下iOS 和 打印机 之间的交互 (Ps:用的不是UIPrinter 那个扫面打印机 发送信息打印的那个框架) 主 ...

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

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

  6. EPSON ESC/POS打印机指令

    原文地址::http://blog.csdn.net/feng88724/article/details/17474351 相关文章 1.微型热敏打印机指令集----https://wenku.bai ...

  7. Android 蓝牙/wifi云打印 ESC/POS热敏打印机打印(连接篇)

    本篇我们将讲解蓝牙打印机和wifi云打印机的连接与数据发送,下一篇讲解ESC/POS命令集 一.蓝牙打印机连接 1.蓝牙权限 2.初始化配置 3.发现设备 4.连接设备 4.1 作为Client连接 ...

  8. Android 蓝牙连接 ESC/POS 热敏打印机打印(ESC/POS指令篇)

    上一篇 主要介绍了如何通过蓝牙连接到打印机.这一篇,我们就介绍如何向打印机发送打印指令,来打印字符和图片. =====================2017.05.09 更新============ ...

  9. python调用打印机打印图片_Python使用Python将图像位数据打印到ESC/POS打印机

    我一直在寻找一个如何格式化和打印bmp到我的收据打印机(这样我可以添加徽标)的例子很长一段时间,所以我怀疑这是一个重复的帖子考虑到其他人是为java或其他脚本语言.通常我很擅长理解指令,但我发现的只是 ...

最新文章

  1. 基于 HTML5 的 WebGL 技术构建 3D 场景(一)
  2. js对象数组(JSON) 根据某个共同字段 分组
  3. 24 个好用到爆的 Python 实用技巧!
  4. html5shiv.js和respond.min.js
  5. 游戏模型提取_狐狸在等我中文版 是一款恋爱冒险游戏
  6. python不满足条件重新输入_如果Python中不满足条件,则拒绝用户输入
  7. STL15-map/multimap容器
  8. mysql删除myisam表数据影响_Mysql 下 Myisam表delete 后 数据恢复问题
  9. 各类原版系统下载:在MSDN下载Windows、MacOS、Linux原版系统镜像
  10. 无线投影之Miracast技术 收集
  11. printf() 输出数据格式汇总
  12. 计算机网络(第七版)谢希仁编著(转载请注明出处---https://www.cnblogs.com/qingl)...
  13. 软件测试需要学习哪些技能?
  14. 防火墙文件打印共享服务器,防火墙 网络打印机共享服务器
  15. mumu显示连接服务器超时,网易mumu模拟器安装不了 网易mumu模拟器安装好久解决方法...
  16. 微信公众平台开发-PHP版
  17. 思科wlc产品文档_思科认证EI CCIE和SP CCIE 怎么选?零基础入门或是网工深造都建议收藏...
  18. 数据库数据的备份和还原
  19. 什么是ftp,什么是ftp?以及具体使用教程
  20. 举个栗子~Tableau 技巧(209):用自定义形状实现刻度环形图

热门文章

  1. 初学者制作VMOS场效应管小功放
  2. 云浮高考成绩查询2021,云浮市2021年高考顺利落幕!
  3. 局域网内,如何使用命令行关闭别人的电脑
  4. 王峻涛:大萧条中的机会
  5. Android SDK安装及配置模拟器
  6. 【运动控制】运动控制类实现
  7. [激光原理与应用-63]:激光器-光学-探测光、泵浦光和种子光三种光的区别
  8. graphql 嵌套查询_了解GraphQL中的查询
  9. 【贪心】AcWing 803. 区间选点
  10. 为什么学编程都建议不要用拼音命名?看知乎大佬的回答!秒懂