package com.eztlib;
import java.util.Hashtable;
import com.google.zxing.BarcodeFormat; //zxingcore-2.3.0.jar
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
public class PrinterEscCmd
{
// 字体大小
public enum LOAD_ID
{
FONT_12((byte)0x00),
FONT_16((byte)0x01),
FONT_24((byte)0x02),
FONT5x7((byte)0x03),
FONT7x8((byte)0x04);
private final byte value;
private LOAD_ID(byte value)
{
this.value = value;
}
public byte getValue() {
return value;
}
}
// 字符旋转角度
public enum ALIGN_MODE
{
ALIGN_Lift((byte)0x00), //居左
ALIGN_Mid((byte)0x01), //居中
ALIGN_Right((byte)0x02); //居右
private final byte value;
private ALIGN_MODE(byte value)
{
this.value = value;
}
public byte getValue() {
return value;
}
}
// 字符旋转角度
public enum ROTATE_ANGLE
{
ROTATE_0((byte)0x00),
ROTATE_90((byte)0x01),
ROTATE_180((byte)0x02),
ROTATE_270((byte)0x03);
private final byte value;
private ROTATE_ANGLE(byte value)
{
this.value = value;
}
public byte getValue() {
return value;
}
}
// 字符放大倍数
public enum ENLARGE_MODE
{
ENLARGE_N((byte)0x00), //不放大
ENLARGE_1((byte)0x01), //放大1倍
ENLARGE_2((byte)0x02), //放大2倍
ENLARGE_3((byte)0x03); //放大3倍
private final byte value;
private ENLARGE_MODE(byte value)
{
this.value = value;
}
public byte getValue() {
return value;
}
}
// 条码字符的打印位置
public enum Bar1DChar_ADDR
{
ADDR_N((byte)0x00), //不打印字符
ADDR_UP((byte)0x01), //条码的上方
ADDR_DOWN((byte)0x02); //条码的下方
private final byte value;
private Bar1DChar_ADDR(byte value)
{
this.value = value;
}
public byte getValue() {
return value;
}
}
//一维条码类型
public enum Bar1DCode_TYPE
{
UPCA((byte)0x00),
UPCE((byte)0x01),
EAN8((byte)0x02),
EAN13((byte)0x03),
ITF25((byte)0x04),
CODEBAR((byte)0x05),
CODE93((byte)0x06),
CODE39((byte)0x07);
private final byte value;
private Bar1DCode_TYPE(byte value)
{
this.value = value;
}
public byte getValue() {
return value;
}
}
//二维条码类型
public enum Bar2DCode_TYPE
{
QRcode((byte)0x00);
private final byte value;
private Bar2DCode_TYPE(byte value)
{
this.value = value;
}
public byte getValue() {
return value;
}
}
//切刀方式
public enum Cuter_TYPE
{
FullCut((byte)0x41), //全切
HalfCut((byte)0x42); //半切
private final byte value;
private Cuter_TYPE(byte value)
{
this.value = value;
}
public byte getValue() {
return value;
}
}
static
{
try {
System.loadLibrary("EZTLIB");
} catch (Exception e) {
e.printStackTrace();
} catch (Throwable e) {
e.printStackTrace();
}
}
/// 函数功能:清空ESC指令缓存
public native void escBufClear();
/// 函数功能:“打印字符串”指令
/// 需要打印的文本字符串
/// 返回true表示成功,返回false表示失败
public native boolean escPrintText(String Text);
///
/// 函数功能:“初始化打印机”指令
/// 打印机初始化(清除打印缓存、各参数恢复默认值)
/// ESC @ ,1B 40 ,打印机初始化
///
/// 返回true表示成功,返回false表示失败
public native boolean escInit();
/// 函数功能:“打印并走纸到黑标/标签位置”指令
/// ESC FF ,1B 0C ,打印并走纸到黑标/标签位置
/// 返回true表示成功,返回false表示失败
public native boolean escLabelStart();
/// 函数功能:“打印回车”指令
/// 返回true表示成功,返回false表示失败
public native boolean escEnter();
/// 函数功能:“字符字体大小设置”指令
/// ESC M n ,1B 4D n ,设置字体大小
/// 字体大小ID号
/// 返回true表示成功,返回false表示失败
public native boolean escCharFont(byte mID);
/// 函数功能:打印缓存内容并走纸
/// ESC d n ,1B 64 n ,打印并进纸 n 行
/// ESC J n ,1B 4A n ,打印并进纸 n 点
/// 走纸距离计量单位标志,LineFlag = true时,以行为单位;LineFlag = flase时,以点为单位,1点= 0.125mm
/// 走纸Param各单位长度
/// 返回true表示成功,返回false表示失败
public native boolean escFeedPaper(boolean LineFlag, byte Param);
/// 函数功能:“字符横向放大”指令
/// ESC U n ,1B 55 n ,横向放大n倍
/// 放大倍数
/// 返回true表示成功,返回false表示失败
public native boolean escWEnlarge(byte mode);
/// 函数功能:“字符纵向放大”指令
/// //ESC V n ,1B 56 n ,纵向放大n倍
/// 放大倍数
/// 返回true表示成功,返回false表示失败
public native boolean escHEnlarge(byte mode);
/// 函数功能:“字符横向纵向放大”指令
/// //ESC W n ,1B 57 n ,横向纵向放大n倍
/// 放大倍数
/// 返回true表示成功,返回false表示失败
public native boolean escWHEnlarge(byte mode);
/// 函数功能:“设置行间距”指令
/// ESC 3 n ,1B 33 n ,设置行间距
/// 行间距参数值,以点为单位,1点=0.125mm
/// 返回true表示成功,返回false表示失败
public native boolean escLineSpace(byte Param);
/// 函数功能:“设置字间距”指令
/// ESC SP n ,1B 20 n ,设置字间距
/// 字符间距参数值,以点为单位,1点=0.125mm
/// 返回true表示成功,返回false表示失败
public native boolean escCharSpace(byte Param);
/// 函数功能:“设置左边距”指令
/// ESC l n ,1B 6C n ,设置左边距
/// 左边距参数值
/// 返回true表示成功,返回false表示失败
public native boolean escLeftMargin(byte Param);
/// 函数功能:“设置右边距”指令
/// ESC Q n ,1B 51 n ,设置右边距
/// 右边距参数值
/// 返回true表示成功,返回false表示失败
public native boolean escRightMargin(byte Param);
/// 函数功能:打印空格或空行
/// ESC f m n ,1B 66 m n ,打印空格或空行,M=1打印 n行空行,M=0打印n个空格
/// LineFlag = true时,以行为单位;LineFlag = flase时,以一个ASCII字符宽度为单位
/// 打印Param各单位长度
/// 返回true表示成功,返回false表示失败
public native boolean escBlank(boolean LineFlag,byte Param);
/// 函数功能:“设置打印绝对位置”指令
/// ESC $ nL nH ,1B 24 nL nH ,设置打印绝对位置
/// 绝对位置
/// 返回true表示成功,返回false表示失败
public native boolean escposition(int Position);
/// 函数功能:“执行水平制表”指令
/// HT ,09 ,执行水平制表
/// 返回true表示成功,返回false表示失败
public native boolean escmaketab();
/// 函数功能:“设置水平制表位置”指令
/// ESC D n1…nk NUL ,1B 44 n1…nk NUL ,设置水平制表位置
/// 水平制表位置
/// 水平制表个数
/// 返回true表示成功,返回false表示失败
public native boolean escpositiontab(byte[] TabList,int ListCt);
/// 函数功能:“字符上划线设置”指令
/// ESC + n ,1B 2B n ,设置/取消上划线打印
/// overline = true, 字符加上划线,overline = false字符无上划线
/// 返回true表示成功,返回false表示失败
public native boolean escOverline(boolean overline);
/// 函数功能:“字符下划线设置”指令
/// ESC - n ,1B 2D n ,设置/取消下划线打印
/// underline = true, 字符加下划线,underline = false字符无下划线
/// 返回true表示成功,返回false表示失败
public native boolean escUnderline(boolean underline);
/// 函数功能:“字符反白打印设置”指令
/// ESC i n ,1B 69 n ,设置/取消反白打印
/// white = true,反白打印,white = false反白打印
/// 返回true表示成功,返回false表示失败
public native boolean escWhite(boolean white);
/// 函数功能:“字符斜体打印设置”指令
/// ESC x n ,1B 78 n ,设置/取消斜体打印
/// italic = true,斜体打印,italic = false斜体打印
/// 返回true表示成功,返回false表示失败
public native boolean escItalic(boolean italic);
/// 函数功能:“字符粗体设置”指令
/// ESC E n ,1B 45 n ,设置/取消粗体打印
/// bold = true,粗体打印,bold = false正常打印
/// 返回true表示成功,返回false表示失败
public native boolean escBold(boolean bold);
/// 函数功能:“设置打印对齐方式”指令
/// ESC a n ,1B 61 n ,设置打印对齐方式(居左、居中、居右)
/// 对齐方式
/// 返回true表示成功,返回false表示失败
public native boolean escAlign(byte mAlign);
/// 函数功能:“设置打印灰度”指令
/// ESC g n ,1B 67 n ,设置打印灰度
/// 灰度等级 0-9
/// 返回true表示成功,返回false表示失败
public native boolean escGray(byte mgray);
/// 函数功能:“设置打印速度”指令
/// ESC m n ,1B 6D n ,设置打印速度
/// n =0 变速 ,n =1 匀速
/// 返回true表示成功,返回false表示失败
public native boolean escSpeed(byte mspeed);
/// 函数功能:“设置字符旋转角度方式”指令
/// FC I n ,1C 49 n ,设置/取消字符旋转
/// 字符旋转角度, Angle=0 旋转0度,Angle=1 旋转90度,Angle=2 旋转180度,Angle=3 旋转270度
/// 返回true表示成功,返回false表示失败
public native boolean escRotate(byte Angle);
/// 函数功能:“设置条形码宽度”指令
/// GS w n ,1D 77 n ,设置条码单元宽度为 n 点,1<=n<=4
/// 条码单元宽度,以点为单位,1点=0.125mm
/// 返回true表示成功,返回false表示失败
public native boolean esc1DBarWidth(byte Param);
/// 函数功能:“设置条形码高度”指令
/// GS h n, 1D 68 n ,设置条码高度为 n 点,1<=n<=255
/// 条码条码高度,以点为单位,1点=0.125mm
/// 返回true表示成功,返回false表示失败
public native boolean esc1DBarHigh(byte Param);
/// 函数功能:“设置条码字符的打印位置”指令
/// GS H n, 1D 48 n ,设置条码字符的打印位置 ,不打印 条码的上方 条码的下方
/// 打印位置
/// 返回true表示成功,返回false表示失败
public native boolean esc1DBarCharAddr(byte mAddr);
/// 设置公司名称
///
/// 返回true表示成功,返回false表示失败
public native boolean escSetCompanyName(String Text);
/// 设置产品型号
///
/// 返回true表示成功,返回false表示失败
public native boolean escSetProductModel(String Text);
/// 读取设备序列号
/// 返回设备序列号
/// 返回设备序列号字节长度
public native int escGetProductID(byte[] mUID);
/// 设置休眠时间
/// 设置time分钟后机器休眠,0<=time<=255 (休眠时间=0且关机时间=0 则机器为不休眠不关机 )
/// 返回true表示成功,返回false表示失败
public native boolean escSetPowerIdleTime(byte time);
/// 设置关机时间
/// 设置time分钟后机器关机,0<=time<=255 (休眠时间=0且关机时间=0 则机器为不休眠不关机 )
/// 返回true表示成功,返回false表示失败
public native boolean escSetPowerOffTime(byte time);
/// 读取检测纸ADC值
/// 返回检测纸ADC值
public native int escGetPaperCheckADC();
/// 设置黑标检测ADC值
/// 黑标检测ADC值
/// 返回true表示成功,返回false表示失败
public native boolean escSetHeiBiaoADC(int value);
/// 设置蓝牙名称
///
/// 返回true表示成功,返回false表示失败
public native boolean escSetBluName(String Text);
/// 设置蓝牙密码
///
/// 返回true表示成功,返回false表示失败
public native boolean escSetBluKey(String Text);
/// 设置串口波特率
///
/// 返回true表示成功,返回false表示失败
public native boolean escSetUartBaud(byte baud);
/// 设置蓝牙波特率
///
/// 返回true表示成功,返回false表示失败
public native boolean escSetBluBaud(byte baud);
/// 读取打印机状态
/// 返回打印机状态
public native byte escGetState();
/// 函数功能:走纸并切纸
/// GS V m n ,1D 56 m n ,走纸 n 点并切纸
/// 切刀类型,mType=0x41全切,mType=0x42半切
/// 走纸Param各单位长度,以点为单位,1点= 0.125mm
/// 返回true表示成功,返回false表示失败
public native boolean escCuter(byte mType,byte Param);
/// 打印图片
/// 单元宽度
/// 图片数据
/// 图片宽度
/// 图片高度
/// 返回true表示成功,返回false表示失败
public native boolean escPicturePrint(byte mType,byte[][] pValue,int Width,int Height);
/// 函数功能:“打印一维条码”指令
/// GS k m n d1…dn, 1D 6B m n d1…dn 打印一维条码 ,m为条码类型 n为条码数据长度 d1…dn为条码数据
/// 一维条码类型
/// 一维条码数据
/// 返回空表示成功,返回其他数据表示失败
public native String esc1DBarPrint(byte Type, String Text);
///
/// 函数功能:打印二维码
///
/// 二维条码类型
/// 二维条码数据
/// 二维条码大小
/// 返回空表示成功,返回其他数据表示失败
public String esc2DBarPrint(Bar2DCode_TYPE mType,String mText,int msize)
{
byte[][] graydata=null;
switch (mType)
{
case QRcode:
Bitmap bitmap =createQRCode(mText,msize);
if(bitmap==null){return "QRcode生成失败";}
graydata=ConvertImageTo2byte(bitmap,(byte)127);//提取图片二值化数据
break;
default: break;
}
if(graydata==null){return "没有生成二维码数据";}
int Width=graydata.length;
int Height = graydata[0].length;
if(escPicturePrint((byte)0,graydata,Width,Height)==false)
{
return "数据写入失败";
}
return "";
}
public Bitmap createQRCode(String str,int msize)
{
try
{
//判断URL合法性
if (str == null || "".equals(str) || str.length() < 1 || msize<10)
{
return null;
}
Hashtable hints = new Hashtable();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
//图像数据转换,使用了矩阵转换
BitMatrix bitMatrix = new QRCodeWriter().encode(str, BarcodeFormat.QR_CODE, msize, msize, hints);
int[] pixels = new int[msize * msize];
//下面这里按照二维码的算法,逐个生成二维码的图片,
//两个for循环是图片横列扫描的结果
for (int y = 0; y < msize; y++)
{
for (int x = 0; x < msize; x++)
{
if (bitMatrix.get(x, y))
{
pixels[y * msize + x] = 0xff000000;
}
else
{
pixels[y * msize + x] = 0xffffffff;
}
}
}
//生成二维码图片的格式,使用ARGB_8888
Bitmap bitmap = Bitmap.createBitmap(msize, msize, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, msize, 0, 0, msize, msize);
return bitmap;
}
catch (WriterException e)
{
e.printStackTrace();
}
return null;
}
//获取取第index位
public int GetBit(byte b, int index) { return ((b & (1 << index)) > 0) ? 1 : 0; }
//将第index位设为1
public byte SetBit(byte b, int index) { return (byte)(b | (1 << index)); }
//将第index位设为0
public byte ClearBit(byte b, int index) { return (byte)(b & (0xff - (1 << index))); }
//将第index位取反
public byte ReverseBit(byte b, int index) { return (byte)(b ^ (byte)(1 << index)); }
///
/// 图像二值化
///
///
///
///
public byte[][] ConvertImageTo2byte(Bitmap bmp,byte cmpvalue ) {
int width = bmp.getWidth(); //获取位图的宽
int height = bmp.getHeight(); //获取位图的高
int wbyte = width / 8;
if ((width % 8) != 0) { wbyte++; }
byte[][] svvalue = new byte[wbyte][height];
int []pixels = new int[width * height]; //通过位图的大小创建像素点数组
bmp.getPixels(pixels, 0, width, 0, 0, width, height);
for(int y = 0; y < height; y++) {
for(int x = 0; x < width; x++) {
int grey = pixels[width * y + x];
int red = ((grey & 0x00FF0000 ) >> 16);
int green = ((grey & 0x0000FF00) >> 8);
int blue = (grey & 0x000000FF);
grey = (int)((float) red * 0.3 + (float)green * 0.59 + (float)blue * 0.11);
if(grey> 16);
int green = ((grey & 0x0000FF00) >> 8);
int blue = (grey & 0x000000FF);
grey = (int)((float) red * 0.3 + (float)green * 0.59 + (float)blue * 0.11);
if(grey