找了各方資料航棱,自己寫了一個(gè)USBPrinter類,代碼如下:
public class USBPrinter {
public static final String ACTION_USB_PERMISSION = "com.usb.printer.USB_PERMISSION";
private static USBPrinter mInstance;
private Context mContext;
private PendingIntent mPermissionIntent;
private UsbManager mUsbManager;
private UsbDeviceConnection mUsbDeviceConnection;
private UsbEndpoint ep,printerEp;
private UsbInterface usbInterface;
private static final int TIME_OUT = 100000;
public static USBPrinter getInstance() {
if (mInstance == null) {
synchronized (USBPrinter.class) {
if (mInstance == null) {
mInstance = new USBPrinter();
}
}
}
return mInstance;
}
/**
* 初始化打印機(jī)萌衬,需要與destroy對(duì)應(yīng)
*
* @param context 上下文
*/
public static void initPrinter(Context context) {
getInstance().init(context);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void init(Context context) {
// list.clear();
mContext = context;
mUsbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
mPermissionIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
mContext.registerReceiver(mUsbDeviceReceiver, filter);
// 列出所有的USB設(shè)備饮醇,并且都請(qǐng)求獲取USB權(quán)限
HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();
for (UsbDevice device : deviceList.values()) {
usbInterface = device.getInterface(0);
if (usbInterface.getInterfaceClass() == 7) {
Log.d("device", device.getProductName() + " " + device.getManufacturerName());
Log.d("device", device.getVendorId() + " " + device.getProductId() + " " + device.getDeviceId());
Log.d("device", usbInterface.getInterfaceClass() + "");
if (!mUsbManager.hasPermission(device)) {
mUsbManager.requestPermission(device, mPermissionIntent);
}else {
connectUsbPrinter(device);
}
}
}
}
private final BroadcastReceiver mUsbDeviceReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.d("action", action);
UsbDevice mUsbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (ACTION_USB_PERMISSION.equals(action)) {
synchronized (this) {
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false) && mUsbDevice != null) {
Log.d("receiver", action);
connectUsbPrinter(mUsbDevice);
} else {
ToastUtil.showShort(context, "USB設(shè)備請(qǐng)求被拒絕");
}
}
} else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
if (mUsbDevice != null) {
ToastUtil.showShort(context, "有設(shè)備拔出");
}
} else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
ToastUtil.showShort(context, "有設(shè)備插入");
if (mUsbDevice != null) {
if (!mUsbManager.hasPermission(mUsbDevice)) {
mUsbManager.requestPermission(mUsbDevice, mPermissionIntent);
}
}
}
}
};
public void close() {
if(mUsbDeviceConnection != null){
mUsbDeviceConnection.close();
mUsbDeviceConnection = null;
}
mContext.unregisterReceiver(mUsbDeviceReceiver);
mContext = null;
mUsbManager = null;
}
private void connectUsbPrinter(UsbDevice mUsbDevice) {
if (mUsbDevice != null) {
for (int i = 0; i < usbInterface.getEndpointCount(); i++) {
ep = usbInterface.getEndpoint(i);
if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {
mUsbDeviceConnection = mUsbManager.openDevice(mUsbDevice);
printerEp = ep;
if (mUsbDeviceConnection != null) {
ToastUtil.showShort(mContext, "設(shè)備已連接");
mUsbDeviceConnection.claimInterface(usbInterface, true);
mUsbDeviceConnection.releaseInterface(usbInterface);
}
}
}
}
} else {
ToastUtil.showShort(mContext, "未發(fā)現(xiàn)可用的打印機(jī)");
}
}
private void write(byte[] bytes) {
if (mUsbDeviceConnection != null) {
int b = mUsbDeviceConnection.bulkTransfer(printerEp, bytes, bytes.length, TIME_OUT);
Log.i("Return Status", "b-->" + b);
} else {
Looper.prepare();
handler.sendEmptyMessage(0);
Looper.loop();
}
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
ToastUtil.showShort(mContext, "未發(fā)現(xiàn)可用的打印機(jī)");
}
};
/**
* 打印文字
* @param msg
*/
public void printText(String msg) {
byte[] bytes = new byte[0];
try {
bytes = msg.getBytes("gbk");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
write(bytes);
}
/**
* 換行打印文字
* @param msg
*/
public void printTextNewLine(String msg) {
byte[] bytes = new byte[0];
try {
bytes = msg.getBytes("gbk");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
write(new String("\n").getBytes());
write(bytes);
}
/**
* 打印空行
* @param size
*/
public void printLine(int size) {
for (int i = 0; i < size; i++) {
printText("\n");
}
}
/**
* 設(shè)置字體大小
* @param size 0:正常大小 1:兩倍高 2:兩倍寬 3:兩倍大小 4:三倍高 5:三倍寬 6:三倍大 7:四倍高 8:四倍寬 9:四倍大小 10:五倍高 11:五倍寬 12:五倍大小
*/
public void setTextSize(int size) {
write(ESCUtil.setTextSize(size));
}
/**
* 字體加粗
* @param isBold
*/
public void bold(boolean isBold) {
if (isBold) write(ESCUtil.boldOn());
else write(ESCUtil.boldOff());
}
/**
* 打印一維條形碼
* @param data
*/
public void printBarCode(String data) {
write(ESCUtil.getPrintBarCode(data, 5, 90, 5, 2));
}
/**
* 設(shè)置對(duì)齊方式
* @param position
*/
public void setAlign(int position) {
byte[] bytes = null;
switch (position) {
case 0:
bytes = ESCUtil.alignLeft();
break;
case 1:
bytes = ESCUtil.alignCenter();
break;
case 2:
bytes = ESCUtil.alignRight();
break;
}
write(bytes);
}
/**
* 切紙
*/
public void cutPager() {
write(ESCUtil.cutter());
}
}
請(qǐng)自行替換代碼里的ToastUtil
里面的ESCUtil是ESC指令工具類,代碼如下:
//常用指令封裝
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)
//初始化打印機(jī)
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;
}
/**
* 打印單個(gè)二維碼 sunmi自定義指令
* @param code: 二維碼數(shù)據(jù)
* @param modulesize: 二維碼塊大小(單位:點(diǎn), 取值 1 至 16 )
* @param errorlevel: 二維碼糾錯(cuò)等級(jí)(0 至 3)
* 0 -- 糾錯(cuò)級(jí)別L ( 7%)
* 1 -- 糾錯(cuò)級(jí)別M (15%)
* 2 -- 糾錯(cuò)級(jí)別Q (25%)
* 3 -- 糾錯(cuò)級(jí)別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();
}
/**
* 橫向兩個(gè)二維碼 sunmi自定義指令
* @param code1: 二維碼數(shù)據(jù)
* @param code2: 二維碼數(shù)據(jù)
* @param modulesize: 二維碼塊大小(單位:點(diǎn), 取值 1 至 16 )
* @param errorlevel: 二維碼糾錯(cuò)等級(jí)(0 至 3)
* 0 -- 糾錯(cuò)級(jí)別L ( 7%)
* 1 -- 糾錯(cuò)級(jí)別M (15%)
* 2 -- 糾錯(cuò)級(jí)別Q (25%)
* 3 -- 糾錯(cuò)級(jí)別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);
}
//光柵位圖打印 設(shè)置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);
}
/*
* 選擇位圖指令 設(shè)置mode
* 需要設(shè)置1B 33 00將行間距設(shè)為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});
}
/**
* 跳指定行數(shù)
*/
public static byte[] nextLine(int lineNum) {
byte[] result = new byte[lineNum];
for (int i = 0; i < lineNum; i++) {
result[i] = LF;
}
return result;
}
// ------------------------underline-----------------------------
//設(shè)置下劃線1點(diǎn)
public static byte[] underlineWithOneDotWidthOn() {
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 45;
result[2] = 1;
return result;
}
//設(shè)置下劃線2點(diǎn)
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-----------------------------
/*
*單字節(jié)模式開啟
*/
public static byte[] singleByte(){
byte[] result = new byte[2];
result[0] = FS;
result[1] = 0x2E;
return result;
}
/*
*單字節(jié)模式關(guān)閉
*/
public static byte[] singleByteOff(){
byte[] result = new byte[2];
result[0] = FS;
result[1] = 0x26;
return result;
}
/**
* 設(shè)置單字節(jié)字符集
*/
public static byte[] setCodeSystemSingle(byte charset){
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 0x74;
result[2] = charset;
return result;
}
/**
* 設(shè)置多字節(jié)字符集
*/
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;
}
/**
* 居中對(duì)齊
*/
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;
}
//切刀
public static byte[] cutter() {
byte[] data = new byte[]{0x1d, 0x56, 0x01};
return data;
}
//走紙到黑標(biāo)
public static byte[] gogogo(){
byte[] data = new byte[]{0x1C, 0x28, 0x4C, 0x02, 0x00, 0x42, 0x31};
return data;
}
////////////////////////////////////////////////////////////////////////////////////
////////////////////////// private /////////////////////////
////////////////////////////////////////////////////////////////////////////////////
private static byte[] setQRCodeSize(int modulesize){
//二維碼塊大小設(shè)置指令
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){
//二維碼糾錯(cuò)等級(jí)設(shè)置指令
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){
//打印已存入數(shù)據(jù)的二維碼
byte[] dtmp;
if(single){ //同一行只打印一個(gè)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();
}
/**
* 設(shè)置字體大小
*/
public static byte[] setTextSize(int size) {
byte[] bytes = CMD_FontSize(size).getBytes();
return bytes;
}
// 字體的大小
// 0:正常大小 1:兩倍高 2:兩倍寬 3:兩倍大小 4:三倍高 5:三倍寬 6:三倍大小
// 7:四倍高 8:四倍寬 9:四倍大小 10:五倍高 11:五倍寬 12:五倍大小
public static String CMD_FontSize(int nfontsize) {
String _cmdstr = "";
// 設(shè)置字體大小
switch (nfontsize) {
case -1:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 0).toString();// 29 33
break;
case 0:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 0).toString();// 29 33
break;
case 1:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 1).toString();
break;
case 2:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 16).toString();
break;
case 3:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 17).toString();
break;
case 4:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 2).toString();
break;
case 5:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 32).toString();
break;
case 6:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 34).toString();
break;
case 7:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 3).toString();
break;
case 8:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 48).toString();
break;
case 9:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 51).toString();
break;
case 10:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 4).toString();
break;
case 11:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 64).toString();
break;
case 12:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 68).toString();
break;
}
Log.d("textSize",_cmdstr);
return _cmdstr;
}
}
補(bǔ)一個(gè)BytesUtil工具類代碼朴艰,
public class BytesUtil {
//字節(jié)流轉(zhuǎn)16進(jìn)制字符串
public static String getHexStringFromBytes(byte[] data) {
if (data == null || data.length <= 0) {
return null;
}
String hexString = "0123456789ABCDEF";
int size = data.length * 2;
StringBuilder sb = new StringBuilder(size);
for (int i = 0; i < data.length; i++) {
sb.append(hexString.charAt((data[i] & 0xF0) >> 4));
sb.append(hexString.charAt((data[i] & 0x0F) >> 0));
}
return sb.toString();
}
//單字符轉(zhuǎn)字節(jié)
private static byte charToByte(char c) {
return (byte) "0123456789ABCDEF".indexOf(c);
}
//16進(jìn)制字符串轉(zhuǎn)字節(jié)數(shù)組
@SuppressLint("DefaultLocale")
public static byte[] getBytesFromHexString(String hexstring){
if(hexstring == null || hexstring.equals("")){
return null;
}
hexstring = hexstring.replace(" ", "");
hexstring = hexstring.toUpperCase();
int size = hexstring.length()/2;
char[] hexarray = hexstring.toCharArray();
byte[] rv = new byte[size];
for(int i=0; i<size; i++){
int pos = i * 2;
rv[i] = (byte) (charToByte(hexarray[pos]) << 4 | charToByte(hexarray[pos + 1]));
}
return rv;
}
//十進(jìn)制字符串轉(zhuǎn)字節(jié)數(shù)組
@SuppressLint("DefaultLocale")
public static byte[] getBytesFromDecString(String decstring){
if(decstring == null || decstring.equals("")){
return null;
}
decstring = decstring.replace(" ", "");
int size = decstring.length()/2;
char[] decarray = decstring.toCharArray();
byte[] rv = new byte[size];
for(int i=0; i<size; i++){
int pos = i * 2;
rv[i] = (byte) (charToByte(decarray[pos])*10 + charToByte(decarray[pos + 1]));
}
return rv;
}
//字節(jié)數(shù)組組合操作1
public static byte[] byteMerger(byte[] byte_1, byte[] byte_2) {
byte[] byte_3 = new byte[byte_1.length + byte_2.length];
System.arraycopy(byte_1, 0, byte_3, 0, byte_1.length);
System.arraycopy(byte_2, 0, byte_3, byte_1.length, byte_2.length);
return byte_3;
}
//字節(jié)數(shù)組組合操作2
public static byte[] byteMerger(byte[][] byteList) {
int length = 0;
for (int i = 0; i < byteList.length; i++) {
length += byteList[i].length;
}
byte[] result = new byte[length];
int index = 0;
for (int i = 0; i < byteList.length; i++) {
byte[] nowByte = byteList[i];
for (int k = 0; k < byteList[i].length; k++) {
result[index] = nowByte[k];
index++;
}
}
for (int i = 0; i < index; i++) {
// CommonUtils.LogWuwei("", "result[" + i + "] is " + result[i]);
}
return result;
}
//生成表格字節(jié)流
public static byte[] initTable(int h, int w){
int hh = h * 32;
int ww = w * 4;
byte[] data = new byte[ hh * ww + 5];
data[0] = (byte)ww;//xL
data[1] = (byte)(ww >> 8);//xH
data[2] = (byte)hh;
data[3] = (byte)(hh >> 8);
int k = 4;
int m = 31;
for(int i=0; i<h; i++){
for(int j=0; j<w; j++){
data[k++] = (byte)0xFF;
data[k++] = (byte)0xFF;
data[k++] = (byte)0xFF;
data[k++] = (byte)0xFF;
}
if(i == h-1) m =30;
for(int t=0; t< m; t++){
for(int j=0; j<w-1; j++){
data[k++] = (byte)0x80;
data[k++] = (byte)0;
data[k++] = (byte)0;
data[k++] = (byte)0;
}
data[k++] = (byte)0x80;
data[k++] = (byte)0;
data[k++] = (byte)0;
data[k++] = (byte)0x01;
}
}
for(int j=0; j<w; j++){
data[k++] = (byte)0xFF;
data[k++] = (byte)0xFF;
data[k++] = (byte)0xFF;
data[k++] = (byte)0xFF;
}
data[k++] = 0x0A;
return data;
}
/**
* 生成二維碼字節(jié)流
*
* @param data
* @param size
* @return
*/
public static byte[] getZXingQRCode(String data, int size) {
try {
Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
//圖像數(shù)據(jù)轉(zhuǎn)換,使用了矩陣轉(zhuǎn)換
BitMatrix bitMatrix = new QRCodeWriter().encode(data, BarcodeFormat.QR_CODE, size, size, hints);
//System.out.println("bitmatrix height:" + bitMatrix.getHeight() + " width:" + bitMatrix.getWidth());
return getBytesFromBitMatrix(bitMatrix);
} catch (WriterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static byte[] getBytesFromBitMatrix(BitMatrix bits) {
if (bits == null) return null;
int h = bits.getHeight();
int w = (bits.getWidth() + 7) / 8;
byte[] rv = new byte[h * w + 4];
rv[0] = (byte) w;//xL
rv[1] = (byte) (w >> 8);//xH
rv[2] = (byte) h;
rv[3] = (byte) (h >> 8);
int k = 4;
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
for (int n = 0; n < 8; n++) {
byte b = getBitMatrixColor(bits, j * 8 + n, i);
rv[k] += rv[k] + b;
}
k++;
}
}
return rv;
}
private static byte getBitMatrixColor(BitMatrix bits, int x, int y) {
int width = bits.getWidth();
int height = bits.getHeight();
if (x >= width || y >= height || x < 0 || y < 0) return 0;
if (bits.get(x, y)) {
return 1;
} else {
return 0;
}
}
/**
* 將bitmap圖轉(zhuǎn)換為頭四位有寬高的光柵位圖
*/
public static byte[] getBytesFromBitMap(Bitmap bitmap) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int bw = (width - 1) / 8 + 1;
byte[] rv = new byte[height * bw + 4];
rv[0] = (byte) bw;//xL
rv[1] = (byte) (bw >> 8);//xH
rv[2] = (byte) height;
rv[3] = (byte) (height >> 8);
int[] pixels = new int[width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
int clr = pixels[width * i + j];
int red = (clr & 0x00ff0000) >> 16;
int green = (clr & 0x0000ff00) >> 8;
int blue = clr & 0x000000ff;
byte gray = (RGB2Gray(red, green, blue));
rv[(width * i + j) / 8 + 4] = (byte) (rv[(width * i + j) / 8 + 4] | (gray << (7 - ((width * i + j) % 8))));
}
}
return rv;
}
/**
* 將bitmap轉(zhuǎn)成按mode指定的N點(diǎn)行數(shù)據(jù)
*/
public static byte[] getBytesFromBitMap(Bitmap bitmap, int mode) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] pixels = new int[width*height];
if(mode == 0 || mode == 1){
byte[] res = new byte[width*height/8 + 5*height/8];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
for(int i = 0; i < height/8; i++){
res[0 + i*(width+5)] = 0x1b;
res[1 + i*(width+5)] = 0x2a;
res[2 + i*(width+5)] = (byte) mode;
res[3 + i*(width+5)] = (byte) (width%256);
res[4 + i*(width+5)] = (byte) (width/256);
for(int j = 0; j < width; j++){
byte gray = 0;
for(int m = 0; m < 8; m++){
int clr = pixels[j + width*(i*8+m)];
int red = (clr & 0x00ff0000) >> 16;
int green = (clr & 0x0000ff00) >> 8;
int blue = clr & 0x000000ff;
gray = (byte) ((RGB2Gray(red, green, blue)<<(7-m))|gray);
}
res[5 + j + i*(width+5)] = gray;
}
}
return res;
}else if(mode == 32 || mode == 33){
byte[] res = new byte[width*height/8 + 5*height/24];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
for(int i = 0; i < height/24; i++){
res[0 + i*(width*3+5)] = 0x1b;
res[1 + i*(width*3+5)] = 0x2a;
res[2 + i*(width*3+5)] = (byte) mode;
res[3 + i*(width*3+5)] = (byte) (width%256);
res[4 + i*(width*3+5)] = (byte) (width/256);
for(int j = 0; j < width; j++){
for(int n = 0; n < 3; n++){
byte gray = 0;
for(int m = 0; m < 8; m++){
int clr = pixels[j + width*(i*24 + m + n*8)];
int red = (clr & 0x00ff0000) >> 16;
int green = (clr & 0x0000ff00) >> 8;
int blue = clr & 0x000000ff;
gray = (byte) ((RGB2Gray(red, green, blue)<<(7-m))|gray);
}
res[5 + j*3 + i*(width*3+5) + n] = gray;
}
}
}
return res;
}else{
return new byte[]{0x0A};
}
}
private static byte RGB2Gray(int r, int g, int b) {
return (false ? ((int) (0.29900 * r + 0.58700 * g + 0.11400 * b) > 200)
: ((int) (0.29900 * r + 0.58700 * g + 0.11400 * b) < 200)) ? (byte) 1 : (byte) 0;
}
/**
* 生成間斷性黑塊數(shù)據(jù)
* @param w : 打印紙寬度, 單位點(diǎn)
* @return
*/
public static byte[] initBlackBlock(int w){
int ww = (w + 7)/8 ;
int n = (ww + 11)/12;
int hh = n * 24;
byte[] data = new byte[ hh * ww + 5];
data[0] = (byte)ww;//xL
data[1] = (byte)(ww >> 8);//xH
data[2] = (byte)hh;
data[3] = (byte)(hh >> 8);
int k = 4;
for(int i=0; i < n; i++){
for(int j=0; j<24; j++){
for(int m =0; m<ww; m++){
if(m/12 == i){
data[k++] = (byte)0xFF;
}else{
data[k++] = 0;
}
}
}
}
data[k++] = 0x0A;
return data;
}
/**
* 生成一大塊黑塊數(shù)據(jù)
* @param h : 黑塊高度, 單位點(diǎn)
* @param w : 黑塊寬度, 單位點(diǎn), 8的倍數(shù)
* @return
*/
public static byte[] initBlackBlock(int h, int w){
int hh = h;
int ww = (w - 1)/8 + 1;
byte[] data = new byte[ hh * ww + 6];
data[0] = (byte)ww;//xL
data[1] = (byte)(ww >> 8);//xH
data[2] = (byte)hh;
data[3] = (byte)(hh >> 8);
int k = 4;
for(int i=0; i<hh; i++){
for(int j=0; j<ww; j++){
data[k++] = (byte)0xFF;
}
}
data[k++] = 0x00;data[k++] = 0x00;
return data;
}
//基本覆蓋熱敏小票打印中所有epson指令的操作
public static byte[] customData(){
byte[] rv = new byte[]{
(byte) 0xB4, (byte) 0xF2, (byte) 0xD3, (byte) 0xA1, (byte) 0xBB, (byte) 0xFA, (byte) 0xD7, (byte) 0xD4, (byte) 0xBC, (byte) 0xEC, 0x0A,
//打印機(jī)自檢
0x1F, 0X1B, 0x1F, 0x53,
//初始化打印機(jī)
0x1B, 0x40,
//分割線---
0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D, 0x0A,
(byte) 0xB8, (byte) 0xC4, (byte) 0xB1, (byte) 0xE4, (byte) 0xD7, (byte) 0xD6, (byte) 0xBC, (byte) 0xE4, (byte) 0xBE, (byte) 0xE0,0x0A,
0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x0A,
//設(shè)置字符右間距
0x30,0x2E, 0x30, 0x3A,(byte) 0xB2, (byte) 0xE2, (byte) 0xCA, (byte) 0xD4, (byte) 0xB2, (byte) 0xE2, (byte) 0xCA, (byte) 0xD4, (byte) 0xB2, (byte) 0xE2, (byte) 0xCA, (byte) 0xD4, 0x0A,
0x30,0x2E, 0x35, 0x3A, 0x1B, 0x20, 0x0C,(byte) 0xB2, (byte) 0xE2, (byte) 0xCA, (byte) 0xD4, (byte) 0xB2, (byte) 0xE2, (byte) 0xCA, (byte) 0xD4, (byte) 0xB2, (byte) 0xE2, (byte) 0xCA, (byte) 0xD4, 0x0A,
0x1B, 0x20, 0x00,
0x31,0x2E, 0x30, 0x3A, 0x1B, 0x20, 0x18, (byte) 0xB2, (byte) 0xE2, (byte) 0xCA, (byte) 0xD4, (byte) 0xB2, (byte) 0xE2, (byte) 0xCA, (byte) 0xD4, (byte) 0xB2, (byte) 0xE2, (byte) 0xCA, (byte) 0xD4, 0x0A,
0x1B, 0x20, 0x00,
0x32,0x2E, 0x30, 0x3A, 0x1B, 0x20, 0x30, (byte) 0xB2, (byte) 0xE2, (byte) 0xCA, (byte) 0xD4, (byte) 0xB2, (byte) 0xE2, (byte) 0xCA, (byte) 0xD4, (byte) 0xB2, (byte) 0xE2, (byte) 0xCA, (byte) 0xD4, 0x0A,
0x1B, 0x20, 0x00,
//分割線===
0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D, 0x0A,
(byte) 0xD7, (byte) 0xD6, (byte) 0xCC, (byte) 0xE5, (byte) 0xD0, (byte) 0xA7, (byte) 0xB9, (byte) 0xFB, (byte) 0xC9, (byte) 0xCC, (byte) 0xC3, (byte) 0xD7, (byte) 0xBF, (byte) 0xC6, (byte) 0xBC, (byte) 0xBC, 0x0A,
0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D, 0x0A,
//字體效果 商米科技
//設(shè)置加粗混移、倍高祠墅、倍寬、下劃線歌径、反白
0x1B, 0x21, 0x08, (byte) 0xBC, (byte) 0xD3, (byte) 0xB4, (byte) 0xD6, (byte) 0xC9, (byte) 0xCC, (byte) 0xC3, (byte) 0xD7, (byte) 0xBF, (byte) 0xC6, (byte) 0xBC, (byte) 0xBC, (byte) 0xC9, (byte) 0xCC, (byte) 0xC3, (byte) 0xD7, (byte) 0xBF, (byte) 0xC6, (byte) 0xBC, (byte) 0xBC, 0x0A,
0x1B, 0x21, 0x00,
0x1B, 0x45, 0x01, (byte) 0xBC, (byte) 0xD3, (byte) 0xB4, (byte) 0xD6, (byte) 0xC9, (byte) 0xCC, (byte) 0xC3, (byte) 0xD7, (byte) 0xBF, (byte) 0xC6, (byte) 0xBC, (byte) 0xBC, (byte) 0xC9, (byte) 0xCC, (byte) 0xC3, (byte) 0xD7, (byte) 0xBF, (byte) 0xC6, (byte) 0xBC, (byte) 0xBC, 0x0A,
0x1B, 0x45, 0x00,
0x1B, 0x21, 0x10, (byte) 0xB1, (byte) 0xB6, (byte) 0xB8, (byte) 0xDF, (byte) 0xC9, (byte) 0xCC, (byte) 0xC3, (byte) 0xD7, (byte) 0xBF, (byte) 0xC6, (byte) 0xBC, (byte) 0xBC, (byte) 0xC9, (byte) 0xCC, (byte) 0xC3, (byte) 0xD7, (byte) 0xBF, (byte) 0xC6, (byte) 0xBC, (byte) 0xBC, 0x0A,
0x1B, 0x21, 0x20, (byte) 0xB1, (byte) 0xB6, (byte) 0xBF, (byte) 0xED, (byte) 0xC9, (byte) 0xCC, (byte) 0xC3, (byte) 0xD7, (byte) 0xBF, (byte) 0xC6, (byte) 0xBC, (byte) 0xBC, (byte) 0xC9, (byte) 0xCC, (byte) 0xC3, (byte) 0xD7, (byte) 0xBF, (byte) 0xC6, (byte) 0xBC, (byte) 0xBC, 0x0A,
0x1D, 0x21, 0x11, (byte) 0xC9, (byte) 0xCC, (byte) 0xC3, (byte) 0xD7, (byte) 0xBF, (byte) 0xC6, (byte) 0xBC, (byte) 0xBC,
0x1D, 0x21, 0x22, (byte) 0xC9, (byte) 0xCC, (byte) 0xC3, (byte) 0xD7, (byte) 0xBF, (byte) 0xC6, (byte) 0xBC, (byte) 0xBC, 0x0A,
0x1D, 0x21, 0x00,
0x1B, 0x21, (byte) 0x80, (byte) 0xCF, (byte) 0xC2, (byte) 0xBB, (byte) 0xAE, (byte) 0xCF, (byte) 0xDF, (byte) 0xC9, (byte) 0xCC, (byte) 0xC3, (byte) 0xD7, (byte) 0xBF, (byte) 0xC6, (byte) 0xBC, (byte) 0xBC, (byte) 0xC9, (byte) 0xCC, (byte) 0xC3, (byte) 0xD7, (byte) 0xBF, (byte) 0xC6, (byte) 0xBC, (byte) 0xBC, 0x0A,
0x1B, 0x21, 0x00,
0x1B, 0x2D, 0x01, (byte) 0xCF, (byte) 0xC2, (byte) 0xBB, (byte) 0xAE, (byte) 0xCF, (byte) 0xDF, (byte) 0xC9, (byte) 0xCC, (byte) 0xC3, (byte) 0xD7, (byte) 0xBF, (byte) 0xC6, (byte) 0xBC, (byte) 0xBC, (byte) 0xC9, (byte) 0xCC, (byte) 0xC3, (byte) 0xD7, (byte) 0xBF, (byte) 0xC6, (byte) 0xBC, (byte) 0xBC, 0x0A,
0x1B, 0x2D, 0x00,
0x1D, 0x42, 0x01,0x1B, 0x21, 0x08, (byte) 0xB7, (byte) 0xB4, (byte) 0xB0, (byte) 0xD7, (byte) 0xC9, (byte) 0xCC, (byte) 0xC3, (byte) 0xD7, (byte) 0xBF, (byte) 0xC6, (byte) 0xBC, (byte) 0xBC, (byte) 0xC9, (byte) 0xCC, (byte) 0xC3, (byte) 0xD7, (byte) 0xBF, (byte) 0xC6, (byte) 0xBC, (byte) 0xBC, 0x0A,
0x1D, 0x42, 0x00,0x1B, 0x21, 0x00,
//分割線***
0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A, 0x0A,
(byte) 0xC5, (byte) 0xC5, (byte) 0xB0, (byte) 0xE6, (byte) 0xCE, (byte) 0xBB, (byte) 0xD6, (byte) 0xC3, 0x0A,
0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A, 0x0A,
//排版位置
//設(shè)置絕對(duì)位置和設(shè)置相對(duì)位置
(byte) 0xD5, (byte) 0xE2, (byte) 0xBE, (byte) 0xE4, (byte) 0xBB, (byte) 0xB0, (byte) 0xB4, (byte) 0xD3, (byte) 0xD0, (byte) 0xD0, (byte) 0xCA, (byte) 0xD7, (byte) 0xBF, (byte) 0xAA, (byte) 0xCA, (byte) 0xBC, 0x0A,
(byte) 0xBE, (byte) 0xF8, (byte) 0xB6, (byte) 0xD4, (byte) 0xCE, (byte) 0xBB, (byte) 0xD6, (byte) 0xC3, 0x1B, 0x24, (byte) 0xC0, 0x00, (byte) 0xC6, (byte) 0xAB, (byte) 0xD2, (byte) 0xC6, 0x38, (byte) 0xB8, (byte) 0xF6, (byte) 0xD7, (byte) 0xD6, 0x0A,
(byte) 0xCF, (byte) 0xE0, (byte) 0xB6, (byte) 0xD4, (byte) 0xCE, (byte) 0xBB, (byte) 0xD6, (byte) 0xC3, 0x1B, 0x5C, 0x30, 0x00, (byte) 0xC6, (byte) 0xAB, (byte) 0xD2, (byte) 0xC6, 0x32, (byte) 0xB8, (byte) 0xF6, (byte) 0xD7, (byte) 0xD6, 0x0A,
//設(shè)置對(duì)齊方式
(byte) 0xBE, (byte) 0xD3, (byte) 0xD7, (byte) 0xF3, 0x0A,
0x1B, 0x61, 0x01, (byte) 0xBE, (byte) 0xD3, (byte) 0xD6, (byte) 0xD0, 0x0A,
0x1B, 0x61, 0x02, (byte) 0xBE, (byte) 0xD3, (byte) 0xD3, (byte) 0xD2, 0x0A,
0x1B, 0x61, 0x00,
//設(shè)置左邊距
0x1D, 0x4C, 0x30, 0x00,
(byte) 0xC9, (byte) 0xE8, (byte) 0xD6, (byte) 0xC3, (byte) 0xD7, (byte) 0xF3, (byte) 0xB1, (byte) 0xDF, (byte) 0xBE, (byte) 0xE0, 0x34, 0x38, (byte) 0xCF, (byte) 0xF1, (byte) 0xCB, (byte) 0xD8, 0x0A,
//設(shè)置打印區(qū)域?qū)挾? 0x1D, 0x57, (byte) 0xF0, 0x00,
(byte) 0xB8, (byte) 0xC4, (byte) 0xB1, (byte) 0xE4, (byte) 0xBF, (byte) 0xC9, (byte) 0xB4, (byte) 0xF2, (byte) 0xD3, (byte) 0xA1, (byte) 0xC7, (byte) 0xF8, (byte) 0xD3, (byte) 0xF2, (byte) 0xCE, (byte) 0xAA, 0x32, 0x34, 0x30, (byte) 0xCF, (byte) 0xF1, (byte) 0xCB, (byte) 0xD8, 0x0A,
//設(shè)置左邊距
0x1D, 0x4C, 0x60, 0x00,
(byte) 0xC9, (byte) 0xE8, (byte) 0xD6, (byte) 0xC3, (byte) 0xD7, (byte) 0xF3, (byte) 0xB1, (byte) 0xDF, (byte) 0xBE, (byte) 0xE0, 0x39, 0x36, (byte) 0xCF, (byte) 0xF1, (byte) 0xCB, (byte) 0xD8, 0x0A,
//設(shè)置打印區(qū)域?qū)挾? 0x1D, 0x57, (byte) 0x78, 0x00,
(byte) 0xB8, (byte) 0xC4, (byte) 0xB1, (byte) 0xE4, (byte) 0xBF, (byte) 0xC9, (byte) 0xB4, (byte) 0xF2, (byte) 0xD3, (byte) 0xA1, (byte) 0xC7, (byte) 0xF8, (byte) 0xD3, (byte) 0xF2, (byte) 0xCE, (byte) 0xAA, 0x31, 0x32, 0x30, (byte) 0xCF, (byte) 0xF1, (byte) 0xCB, (byte) 0xD8, 0x0A,
0x1D, 0x4C, 0x00, 0x00,
0x1D, 0x57, (byte) 0x80, 0x01,
//水平制表符-跳格
(byte) 0xC4, (byte) 0xAC, 0x09, (byte) 0xC8, (byte) 0xCF, 0x09, (byte) 0xCC, (byte) 0xF8, 0x09, (byte) 0xB8, (byte) 0xF1, 0x09, 0x0A,
0x1B, 0x44, 0x01, 0x02, 0x04, 0x08, 0x0A, 0x00,
(byte) 0xD7, (byte) 0xD4, 0x09, (byte) 0xB6, (byte) 0xA8, 0x09, (byte) 0xD2, (byte) 0xE5, 0x09, (byte) 0xCC, (byte) 0xF8, 0x09, (byte) 0xB8, (byte) 0xF1, 0x09, 0x0A,
//設(shè)置行高
0x1B, 0x33, 0x60, (byte) 0xC9, (byte) 0xE8, (byte) 0xD6, (byte) 0xC3, (byte) 0xD0, (byte) 0xD0, (byte) 0xB8, (byte) 0xDF, 0x3A, 0x39, 0x36, (byte) 0xB5, (byte) 0xE3, (byte) 0xD0, (byte) 0xD0, 0x0A,
0x1B, 0x33, 0x40, (byte) 0xC9, (byte) 0xE8, (byte) 0xD6, (byte) 0xC3, (byte) 0xD0, (byte) 0xD0, (byte) 0xB8, (byte) 0xDF, 0x3A, 0x36, 0x34, (byte) 0xB5, (byte) 0xE3, (byte) 0xD0, (byte) 0xD0, 0x0A,
0x1B, 0x33, 0x00, (byte) 0xC9, (byte) 0xE8, (byte) 0xD6, (byte) 0xC3, (byte) 0xD0, (byte) 0xD0, (byte) 0xB8, (byte) 0xDF, 0x3A, 0x30, (byte) 0xB5, (byte) 0xE3, (byte) 0xD0, (byte) 0xD0, 0x0A,
0x1B, 0x32, (byte) 0xC4, (byte) 0xAC, (byte) 0xC8, (byte) 0xCF, (byte) 0xD0, (byte) 0xD0, (byte) 0xB8, (byte) 0xDF, 0x0A,
//分割線---
0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D, 0x0A,
(byte) 0xD6, (byte) 0xAE, (byte) 0xBA, (byte) 0xF3, (byte) 0xBD, (byte) 0xAB, (byte) 0xD7, (byte) 0xDF, (byte) 0xD6, (byte) 0xBD, 0x0A,
0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D, 0x0A,
//打印并走紙
0x1B, 0x4A, 0x40, (byte) 0xD7, (byte) 0xDF, (byte) 0xD6, (byte) 0xBD, 0x36, 0x34, (byte) 0xB5, (byte) 0xE3, (byte) 0xD0, (byte) 0xD0, 0x0A,
0x1B, 0x4A, 0x60, (byte) 0xD7, (byte) 0xDF, (byte) 0xD6, (byte) 0xBD, 0x39, 0x36, (byte) 0xB5, (byte) 0xE3, (byte) 0xD0, (byte) 0xD0, 0x0A,
0x1B, 0x64, 0x0A, (byte) 0xD7, (byte) 0xDF, (byte) 0xD6, (byte) 0xBD, 0x31, 0x30, (byte) 0xD0, (byte) 0xD0, 0x0A,
0x1B, 0x64, 0x01, (byte) 0xD7, (byte) 0xDF, (byte) 0xD6, (byte) 0xBD, 0x31, (byte) 0xD0, (byte) 0xD0, 0x0A,
//分割線===
0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D, 0x0A,
(byte) 0xB4, (byte) 0xF2, (byte) 0xD3, (byte) 0xA1, (byte) 0xCC, (byte) 0xF5, (byte) 0xC2, (byte) 0xEB, 0x0A,
0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D, 0x0A,
//打印條碼
0x1D, 0x48, 0x02,
//upca
0x1B, 0x61, 0x00, 0x1D, 0x68, 0x20, 0x1D, 0x77, 0x02,
0x1D, 0x6B, 0x41, 0x0c, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x0A,
0x1D, 0x6B, 0x00, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x00, 0x0A,
//upce
0x1B, 0x61, 0x01, 0x1D, 0x68, 0x40, 0x1D, 0x77, 0x04,
0x1D, 0x6B, 0x42, 0x08, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x0A,
0x1D, 0x6B, 0x01, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x00, 0x0A,
//ean13
0x1B, 0x61, 0x02, 0x1D, 0x68, 0x60, 0x1D, 0x77, 0x02,
0x1D, 0x6B, 0x43, 0x0D, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x0A,
0x1D, 0x6B, 0x02, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x00, 0x0A,
//ean8
0x1B, 0x61, 0x00, 0x1D, 0x68, (byte) 0x80, 0x1D, 0x77, 0x05,
0x1D, 0x6B, 0x44, 0x08, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x0A,
0x1D, 0x6B, 0x03, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x00, 0x0A,
//code39
0x1B, 0x61, 0x01, 0x1D, 0x68, (byte) 0xA0, 0x1D, 0x77, 0x02,
0x1D, 0x6B, 0x45, 0x0A, 0x33, 0x36, 0x39, 0x53, 0x55, 0x4E, 0x4D, 0x49, 0x25, 0x24, 0x0A,
0x1D, 0x6B, 0x04, 0x33, 0x36, 0x39, 0x53, 0x55, 0x4E, 0x4D, 0x49, 0x25, 0x24, 0x00, 0x0A,
//itf
0x1B, 0x61, 0x02, 0x1D, 0x68, (byte) 0xC0, 0x1D, 0x77, 0x03,
0x1D, 0x6B, 0x46, 0x0C, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x0A,
0x1D, 0x6B, 0x05, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x00, 0x0A,
//codebar
0x1B, 0x61, 0x00, 0x1D, 0x68, (byte) 0xE0, 0x1D, 0x77, 0x03,
0x1D, 0x6B, 0x47, 0x0A, 0x41, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x41, 0x0A,
//0x1D, 0x6B, 0x06, 0x41, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x41, 0x00, 0x0A,
//code93
0x1B, 0x61, 0x01, 0x1D, 0x68, (byte) 0xFF, 0x1D, 0x77, 0x02,
0x1D, 0x6B, 0x48, 0x0C, 0x53, 0x55, 0x4E, 0x4D, 0x49, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x0A,
//code128
0x1B, 0x61, 0x00, 0x1D, 0x68, (byte) 0xB0, 0x1D, 0x77, 0x02,
0x1D, 0x6B, 0x49, 0x0A, 0x7B, 0x41, 0x53, 0x55, 0x4E, 0x4D, 0x49, 0x30, 0x31, 0x32, 0x0A,
0x1D, 0x6B, 0x49, 0x0C, 0x7B, 0x42, 0x53, 0x55, 0x4E, 0x4D, 0x49, 0x73, 0x75, 0x6E, 0x6D, 0x69, 0x0A,
0x1D, 0x6B, 0x49, 0x0B, 0x7B, 0x43, 0x01, 0xc, 0x17, 0x22, 0x2d, 0x38, 0x4e, 0x59, 0x5a, 0x0A,
//分割線***
0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A, 0x0A,
(byte) 0xB4, (byte) 0xF2, (byte) 0xD3, (byte) 0xA1, (byte) 0xB6, (byte) 0xFE, (byte) 0xCE, (byte) 0xAC, (byte) 0xC2, (byte) 0xEB, 0x0A,
0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A,0x2A, 0x2A, 0x2A, 0x2A, 0x0A,
//打印二維碼
0x1B, 0x61, 0x01,
0x1D, 0x28, 0x6B, 0x03, 0x00, 0x31, 0x43, 0x09,
0x1D, 0x28, 0x6B, 0x03, 0x00, 0x31, 0x45, 0x32,
0x1D, 0x28, 0x6B, 0x0B, 0x00, 0x31, 0x50, 0x30, (byte) 0xC9, (byte) 0xCC, (byte) 0xC3, (byte) 0xD7, (byte) 0xBF, (byte) 0xC6, (byte) 0xBC, (byte) 0xBC,
0x1D, 0x28, 0x6B, 0x03, 0x00, 0x31, 0x51, 0x30, 0x0A,
0x1B, 0x61, 0x00,
//分割線--- (之后將實(shí)現(xiàn)打印光柵位圖的方法饵隙,再次之前使用1b 61 01 居中)
0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D, 0x0A,
(byte) 0xB4, (byte) 0xF2, (byte) 0xD3, (byte) 0xA1, (byte) 0xB9, (byte) 0xE2, (byte) 0xD5, (byte) 0xA4, (byte) 0xCD, (byte) 0xBC, (byte) 0xCF, (byte) 0xF1, 0x0A,
0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D, 0x2D,0x2D,0x2D,0x2D,0x2D, 0x0A,
0x1B, 0x61, 0x01,
};
return rv;
}
//部分字符打印的分割線標(biāo)志
public static byte[] wordData(){
byte rv[] = new byte[]{
//分割線===
0x1B, 0x61, 0x00,
0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D, 0x0A,
(byte) 0xD7, (byte) 0xD6, (byte) 0xB7, (byte) 0xFB, (byte) 0xBC, (byte) 0xAF, (byte) 0xC9, (byte) 0xE8, (byte) 0xD6, (byte) 0xC3, 0x0A,
0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D,0x3D, 0x3D, 0x3D, 0x3D, 0x0A,
0x1C, 0x26, 0x1C, 0x43, 0x00,
};
return rv;
}
}
使用方法示例:
USBPrinter usbPrinter = USBPrinter.getInstance();
usbPrinter.initPrinter(this);
usbPrinter.bold(true);
usbPrinter.setTextSize(3);
usbPrinter.setAlign(1);
usbPrinter.printTextNewLine(tableName);
usbPrinter.printLine(1);
usbPrinter.bold(false);
usbPrinter.printTextNewLine("出品單號(hào):"+bean.getKitExpNumber());
usbPrinter.printTextNewLine("出品員:"+bean.getChefName());
usbPrinter.printBarCode("6936983800013");
usbPrinter.printLine(5);
usbPrinter.cutPager();
記得在Actvity的onDestroy生命周期里調(diào)用USBPrinter.getInstance().close()方法