package com.dayu.rechargeqh.utils; import android.graphics.Bitmap; import java.io.ByteArrayOutputStream; //常用指令封装 public class ESCUtil { public static final byte ESC = 0x1B;// Escape public static final byte FS = 0x1C;// Text delimiter public static final byte GS = 0x1D;// Group separator public static final byte DLE = 0x10;// data link escape public static final byte EOT = 0x04;// End of transmission public static final byte ENQ = 0x05;// Enquiry character public static final byte SP = 0x20;// Spaces public static final byte HT = 0x09;// Horizontal list public static final byte LF = 0x0A;//Print and wrap (horizontal orientation) public static final byte CR = 0x0D;// Home key public static final byte FF = 0x0C;// Carriage control (print and return to the standard mode (in page mode)) public static final byte CAN = 0x18;// Canceled (cancel print data in page mode) //初始化打印机 public static byte[] init_printer() { byte[] result = new byte[2]; result[0] = ESC; result[1] = 0x40; return result; } //打印浓度指令 public static byte[] setPrinterDarkness(int value){ byte[] result = new byte[9]; result[0] = GS; result[1] = 40; result[2] = 69; result[3] = 4; result[4] = 0; result[5] = 5; result[6] = 5; result[7] = (byte) (value >> 8); result[8] = (byte) value; return result; } /** * 打印单个二维码 sunmi自定义指令 * @param code: 二维码数据 * @param modulesize: 二维码块大小(单位:点, 取值 1 至 16 ) * @param errorlevel: 二维码纠错等级(0 至 3) * 0 -- 纠错级别L ( 7%) * 1 -- 纠错级别M (15%) * 2 -- 纠错级别Q (25%) * 3 -- 纠错级别H (30%) */ public static byte[] getPrintQRCode(String code, int modulesize, int errorlevel){ ByteArrayOutputStream buffer = new ByteArrayOutputStream(); try{ buffer.write(setQRCodeSize(modulesize)); buffer.write(setQRCodeErrorLevel(errorlevel)); buffer.write(getQCodeBytes(code)); buffer.write(getBytesForPrintQRCode(true)); }catch(Exception e){ e.printStackTrace(); } return buffer.toByteArray(); } /** * 横向两个二维码 sunmi自定义指令 * @param code1: 二维码数据 * @param code2: 二维码数据 * @param modulesize: 二维码块大小(单位:点, 取值 1 至 16 ) * @param errorlevel: 二维码纠错等级(0 至 3) * 0 -- 纠错级别L ( 7%) * 1 -- 纠错级别M (15%) * 2 -- 纠错级别Q (25%) * 3 -- 纠错级别H (30%) */ public static byte[] getPrintDoubleQRCode(String code1, String code2, int modulesize, int errorlevel){ ByteArrayOutputStream buffer = new ByteArrayOutputStream(); try{ buffer.write(setQRCodeSize(modulesize)); buffer.write(setQRCodeErrorLevel(errorlevel)); buffer.write(getQCodeBytes(code1)); buffer.write(getBytesForPrintQRCode(false)); buffer.write(getQCodeBytes(code2)); //加入横向间隔 buffer.write(new byte[]{0x1B, 0x5C, 0x18, 0x00}); buffer.write(getBytesForPrintQRCode(true)); }catch(Exception e){ e.printStackTrace(); } return buffer.toByteArray(); } /** * 光栅打印二维码 */ public static byte[] getPrintQRCode2(String data, int size){ byte[] bytes1 = new byte[4]; bytes1[0] = GS; bytes1[1] = 0x76; bytes1[2] = 0x30; bytes1[3] = 0x00; byte[] bytes2 = BytesUtil.getZXingQRCode(data, size); return BytesUtil.byteMerger(bytes1, bytes2); } /** * 打印一维条形码 */ public static byte[] getPrintBarCode(String data, int symbology, int height, int width, int textposition){ if(symbology < 0 || symbology > 10){ return new byte[]{LF}; } if(width < 2 || width > 6){ width = 2; } if(textposition <0 || textposition > 3){ textposition = 0; } if(height < 1 || height>255){ height = 162; } ByteArrayOutputStream buffer = new ByteArrayOutputStream(); try{ buffer.write(new byte[]{0x1D,0x66,0x01,0x1D,0x48,(byte)textposition, 0x1D,0x77,(byte)width,0x1D,0x68,(byte)height,0x0A}); byte[] barcode; if(symbology == 10){ barcode = BytesUtil.getBytesFromDecString(data); }else{ barcode = data.getBytes("GB18030"); } if(symbology > 7){ buffer.write(new byte[]{0x1D,0x6B,0x49,(byte)(barcode.length+2),0x7B, (byte) (0x41+symbology-8)}); }else{ buffer.write(new byte[]{0x1D,0x6B,(byte)(symbology + 0x41),(byte)barcode.length}); } buffer.write(barcode); }catch(Exception e){ e.printStackTrace(); } return buffer.toByteArray(); } //光栅位图打印 public static byte[] printBitmap(Bitmap bitmap){ byte[] bytes1 = new byte[4]; bytes1[0] = GS; bytes1[1] = 0x76; bytes1[2] = 0x30; bytes1[3] = 0x00; byte[] bytes2 = BytesUtil.getBytesFromBitMap(bitmap); return BytesUtil.byteMerger(bytes1, bytes2); } //光栅位图打印 设置mode public static byte[] printBitmap(Bitmap bitmap, int mode){ byte[] bytes1 = new byte[4]; bytes1[0] = GS; bytes1[1] = 0x76; bytes1[2] = 0x30; bytes1[3] = (byte) mode; byte[] bytes2 = BytesUtil.getBytesFromBitMap(bitmap); return BytesUtil.byteMerger(bytes1, bytes2); } //光栅位图打印 public static byte[] printBitmap(byte[] bytes){ byte[] bytes1 = new byte[4]; bytes1[0] = GS; bytes1[1] = 0x76; bytes1[2] = 0x30; bytes1[3] = 0x00; return BytesUtil.byteMerger(bytes1, bytes); } /* * 选择位图指令 设置mode * 需要设置1B 33 00将行间距设为0 */ public static byte[] selectBitmap(Bitmap bitmap, int mode){ return BytesUtil.byteMerger(BytesUtil.byteMerger(new byte[]{0x1B, 0x33, 0x00}, BytesUtil.getBytesFromBitMap(bitmap, mode)), new byte[]{0x0A, 0x1B, 0x32}); } /** * 跳指定行数 */ public static byte[] nextLine(int lineNum) { byte[] result = new byte[lineNum]; for (int i = 0; i < lineNum; i++) { result[i] = LF; } return result; } // ------------------------underline----------------------------- //设置下划线1点 public static byte[] underlineWithOneDotWidthOn() { byte[] result = new byte[3]; result[0] = ESC; result[1] = 45; result[2] = 1; return result; } //设置下划线2点 public static byte[] underlineWithTwoDotWidthOn() { byte[] result = new byte[3]; result[0] = ESC; result[1] = 45; result[2] = 2; return result; } //取消下划线 public static byte[] underlineOff() { byte[] result = new byte[3]; result[0] = ESC; result[1] = 45; result[2] = 0; return result; } // ------------------------bold----------------------------- /** * 字体加粗 */ public static byte[] boldOn() { byte[] result = new byte[3]; result[0] = ESC; result[1] = 69; result[2] = 0xF; return result; } /** * 取消字体加粗 */ public static byte[] boldOff() { byte[] result = new byte[3]; result[0] = ESC; result[1] = 69; result[2] = 0; return result; } // ------------------------character----------------------------- /* *单字节模式开启 */ public static byte[] singleByte(){ byte[] result = new byte[2]; result[0] = FS; result[1] = 0x2E; return result; } /* *单字节模式关闭 */ public static byte[] singleByteOff(){ byte[] result = new byte[2]; result[0] = FS; result[1] = 0x26; return result; } /** * 设置单字节字符集 */ public static byte[] setCodeSystemSingle(byte charset){ byte[] result = new byte[3]; result[0] = ESC; result[1] = 0x74; result[2] = charset; return result; } /** * 设置多字节字符集 */ public static byte[] setCodeSystem(byte charset){ byte[] result = new byte[3]; result[0] = FS; result[1] = 0x43; result[2] = charset; return result; } // ------------------------Align----------------------------- /** * 居左 */ public static byte[] alignLeft() { byte[] result = new byte[3]; result[0] = ESC; result[1] = 97; result[2] = 0; return result; } /** * 居中对齐 */ public static byte[] alignCenter() { byte[] result = new byte[3]; result[0] = ESC; result[1] = 97; result[2] = 1; return result; } /** * 居右 */ public static byte[] alignRight() { byte[] result = new byte[3]; result[0] = ESC; result[1] = 97; result[2] = 2; return result; } //////////////////////////////////////////////////////////////////////////////////// ////////////////////////// private ///////////////////////// //////////////////////////////////////////////////////////////////////////////////// private static byte[] setQRCodeSize(int modulesize){ //二维码块大小设置指令 byte[] dtmp = new byte[8]; dtmp[0] = GS; dtmp[1] = 0x28; dtmp[2] = 0x6B; dtmp[3] = 0x03; dtmp[4] = 0x00; dtmp[5] = 0x31; dtmp[6] = 0x43; dtmp[7] = (byte)modulesize; return dtmp; } private static byte[] setQRCodeErrorLevel(int errorlevel){ //二维码纠错等级设置指令 byte[] dtmp = new byte[8]; dtmp[0] = GS; dtmp[1] = 0x28; dtmp[2] = 0x6B; dtmp[3] = 0x03; dtmp[4] = 0x00; dtmp[5] = 0x31; dtmp[6] = 0x45; dtmp[7] = (byte)(48+errorlevel); return dtmp; } private static byte[] getBytesForPrintQRCode(boolean single){ //打印已存入数据的二维码 byte[] dtmp; if(single){ //同一行只打印一个QRCode, 后面加换行 dtmp = new byte[9]; dtmp[8] = 0x0A; }else{ dtmp = new byte[8]; } dtmp[0] = 0x1D; dtmp[1] = 0x28; dtmp[2] = 0x6B; dtmp[3] = 0x03; dtmp[4] = 0x00; dtmp[5] = 0x31; dtmp[6] = 0x51; dtmp[7] = 0x30; return dtmp; } private static byte[] getQCodeBytes(String code) { //二维码存入指令 ByteArrayOutputStream buffer = new ByteArrayOutputStream(); try { byte[] d = code.getBytes("GB18030"); int len = d.length + 3; if (len > 7092) len = 7092; buffer.write((byte) 0x1D); buffer.write((byte) 0x28); buffer.write((byte) 0x6B); buffer.write((byte) len); buffer.write((byte) (len >> 8)); buffer.write((byte) 0x31); buffer.write((byte) 0x50); buffer.write((byte) 0x30); for (int i = 0; i < d.length && i < len; i++) { buffer.write(d[i]); } } catch (Exception e) { e.printStackTrace(); } return buffer.toByteArray(); } }