上一篇文章结束了ESC/POS的指令集,没看过的可以去看一下,可以当作工具文档来使用的
  android 控制POS机图文打印(一)
  这一篇正式介绍如何使用POS机来打印图文信息。
  首先介绍一下,ESC/POS指令是如何使用的,
  字体加粗指令:
  byte[] FONT_B =new byte[3];
  FONT_B[0] = 27;
  FONT_B[1] = 33;
  FONT_B[2] = 8;
  字体纵向放大一倍:
  byte[] CLEAR_FONT =new byte[3];
  CLEAR_FONT[0] = 0x1c;
  CLEAR_FONT[1] = 0x21;
  CLEAR_FONT[2] = 0;
  清除字体放大指令:
  byte[] FD_FONT =new byte[3];
  FD_FONT[0] = 0x1c;
  FD_FONT[1] = 0x21;
  FD_FONT[2] = 4;
  打印条形码指令:
  byte[] PRINT_CODE =new byte[9];
  PRINT_CODE[0] = 0x1d;
  PRINT_CODE[1] = 0x68;
  PRINT_CODE[2] = 120;
  PRINT_CODE[3] = 0x1d;
  PRINT_CODE[4] = 0x48;
  PRINT_CODE[5] = 0x10;
  PRINT_CODE[6] = 0x1d;
  PRINT_CODE[7] = 0x6B;
  PRINT_CODE[8] = 0x02;
  等等的指令使用。。。
  可以参考下上一篇文章的指令集来进行设置。其中,ESC/POS指令是可以进行十进制和十六进制的设定的,这个大家要注意了。
  接下来是介绍如何连接到打印机。
  private static StringPRINT_IP = "192.168.1.111";// 打印机IP地址
  private staticint PRINT_PORT = 9100;// 打印机端口 默认为9100 建议不要修改打印机端口,修改了可能会连接不上的
  这里设定了打印机的IP地址和端口,其中,端口号为9100是打印机默认的设置,最好就不要去修改,如果修改了,可能导致连接不上的,我一开始的时候设置了9000,就连接不上了。。。
  然后就通过socket进行连接打印机
  // 建立打印机连接
  socket = new Socket();
  InetSocketAddress iSocketAddress = new InetSocketAddress(PRINT_IP, PRINT_PORT);// 绑定打印机
  socket.connect(iSocketAddress);// 建立连接
  接下来就是写一个打印的方法,调用打印机传输指令和数据到打印机进行打印。
  直接上代码了,代码里面的注释得非常清楚
  [java] view plaincopy

     - /**
-      * @param PRINT_DATA
-      *            小票主要数据
-      * @param GS_INFO
-      *            小票附带信息
-      * @param CAIDAN_SN
-      *            小票号码
-      */
- public void print(List<Map<String, Object>> PRINT_DATA,Map<String, String> GS_INFO, String CAIDAN_SN) {  
- if (PRINT_DATA != null && PRINT_DATA.size() > 0) {  
- try {  
- // 条码打印指令
- byte[] PRINT_CODE = new byte[9];  
-             PRINT_CODE[0] = 0x1d;  
-             PRINT_CODE[1] = 0x68;  
-             PRINT_CODE[2] = 120;  
-             PRINT_CODE[3] = 0x1d;  
-             PRINT_CODE[4] = 0x48;  
-             PRINT_CODE[5] = 0x10;  
-             PRINT_CODE[6] = 0x1d;  
-             PRINT_CODE[7] = 0x6B;  
-             PRINT_CODE[8] = 0x02;  
- // 清除字体放大指令
- byte[] FD_FONT = new byte[3];  
-             FD_FONT[0] = 0x1c;  
-             FD_FONT[1] = 0x21;  
-             FD_FONT[2] = 4;  
- // 字体加粗指令
- byte[] FONT_B = new byte[3];  
-             FONT_B[0] = 27;  
-             FONT_B[1] = 33;  
-             FONT_B[2] = 8;  
- // 字体纵向放大一倍
- byte[] CLEAR_FONT = new byte[3];  
-             CLEAR_FONT[0] = 0x1c;  
-             CLEAR_FONT[1] = 0x21;  
-             CLEAR_FONT[2] = 0;  
- // 计算合计金额
- int price = 0;  
- // 初始化打印机
-             socketOut.write(27);  
-             socketOut.write(64);  
-             socketOut.write(FD_FONT);// 字体放大
-             socketOut.write(FONT_B);// 字体加粗
-             socketOut.write(10);  
-             writer.write("  " + GS_INFO.get("GS_Name") + " \r\n");  
-             writer.flush();// 关键,很重要,不然指令一次性输出,后面指令覆盖前面指令,导致取消放大指令无效
-             socketOut.write(CLEAR_FONT);  
-             socketOut.write(10);  
-             writer.write("NO: " + CAIDAN_SN + " \r\n");  
-             writer.write("------------------------------\r\n");  
-             writer.write("买家姓名: " + GS_INFO.get("GS_user_name") + "\r\n");  
-             writer.write("地址: " + GS_INFO.get("GS_address") + "\r\n");  
-             writer.write("联系电话: " + GS_INFO.get("GS_tel") + " \r\n");  
-             writer.write("付款方式: " + GS_INFO.get("GS_pay_type") + "\r\n");  
-             writer.write("------------------------------\r\n");  
-             writer.write(Fix_String_Lenth(1,Colum_Name[0], 4)  
-                     + Fix_String_Lenth(0,Colum_Name[1], 14)  
-                     + Fix_String_Lenth(1,Colum_Name[2], 4)  
-                     + Fix_String_Lenth(1,Colum_Name[3], 6) + "\r\n");  
- for (int i = 0; i < PRINT_DATA.size() - 1; i++) {  
-                 writer.write(Fix_String_Lenth(1,i + 1 + "", 2)  
-                         + Fix_String_Lenth(0,PRINT_DATA.get(i).get("cai_name").toString(), 14)  
-                         + Fix_String_Lenth(1,PRINT_DATA.get(i).get("cai_num").toString(), 4)  
-                         + Fix_String_Lenth(1,PRINT_DATA.get(i).get("cai_price").toString(), 6) + "\r\n");  
-                 price += Double.parseDouble(PRINT_DATA.get(i).get("cai_price").toString());  
-             }  
- // 打印二维码
-             Bitmap bmp = (Bitmap)PRINT_DATA.get(PRINT_DATA.size() - 1).get("erweima");  
- byte[] data = new byte[] { 0x1B, 0x33, 0x00 };  
-             socketOut.write(data);  
-             data[0] = (byte)0x00;  
-             data[1] = (byte)0x00;  
-             data[2] = (byte)0x00;    //重置参数
- int pixelColor;  
- // ESC * m nL nH 点阵图
- byte[] escBmp = new byte[] { 0x1B, 0x2A, 0x00, 0x00, 0x00 };  
-             escBmp[2] = (byte)0x21;  
- //nL, nH  
-             escBmp[3] = (byte)(bmp.getWidth() % 256);  
-             escBmp[4] = (byte)(bmp.getWidth() / 256);  
- // 每行进行打印
- for (int i = 0; i < bmp.getHeight()  / 24 + 1; i++){  
-                 socketOut.write(escBmp);  
- for (int j = 0; j < bmp.getWidth(); j++){  
- for (int k = 0; k < 24; k++){  
- if (((i * 24) + k) < bmp.getHeight()){  
-                             pixelColor = bmp.getPixel(j, (i * 24) + k);  
- if (pixelColor != -1){  
-                                 data[k / 8] += (byte)(128 >> (k % 8));  
-                             }  
-                         }  
-                     }  
-                     socketOut.write(data);  
- // 重置参数
-                     data[0] = (byte)0x00;  
-                     data[1] = (byte)0x00;  
-                     data[2] = (byte)0x00;  
-                 }  
- //换行
- byte[] byte_send1 = new byte[2];  
-                 byte_send1[0] = 0x0d;  
-                 byte_send1[1] = 0x0a;  
-                 socketOut.write(byte_send1);  
-             }  
- //换行
- byte[] byte_send2 = new byte[2];  
-             byte_send2[0] = 0x0d;  
-             byte_send2[1] = 0x0a;  
- //发送测试信息 
-             socketOut.write(byte_send2);  
-             writer.write("------------------------------\r\n");  
-             writer.write("本单共" + (PRINT_DATA.size() - 1) + "件商品,合计费用:" + price + "元\r\n");  
-             writer.write("------------------------------\r\n");  
-             writer.write("  谢 谢 惠 顾\r\n");  
- // 下面指令为打印完成后自动走纸
-             writer.write(27);  
-             writer.write(100);  
-             writer.write(4);  
-             writer.write(10);  
-             writer.close();  
-             socketOut.close();  
-         } catch (IOException e) {  
-             e.printStackTrace();  
-         } catch (Exception e) {  
-             e.printStackTrace();  
-         }  
-         }  
-     }  
打印文字是传输String过去进行打印的,而需要打印图片的话比较麻烦一下,需要把图片转换成点阵数据然后进行每行打印,可以参考print方法。
  然后直接调用该方法就可以进行打印了,记住,android4.0之后不能在主线程中执行了,需要新建一个线程来执行该方法,如
  [java] view plaincopy

     - new Thread() {  
- <span style="white-space:pre">    </span>public void run() {  
- <span style="white-space:pre">        </span>try {  
- <span style="white-space:pre">            </span>new PrintLine().print(lists, mapgs, sn);  
- <span style="white-space:pre">        </span>} catch (IOException e) {  
- <span style="white-space:pre">            </span>e.printStackTrace();  
- <span style="white-space:pre">        </span>}  
- <span style="white-space:pre">    </span>};  
- }.start();  
其实android调用po
android 控制POS机图文打印(二)
原文:http://www.cnblogs.com/cute/p/4892418.html