|
@@ -1,246 +1,246 @@
|
|
|
-package com.telpo.tps508;
|
|
|
-
|
|
|
-import android.app.Activity;
|
|
|
-import android.content.Context;
|
|
|
-import android.graphics.Bitmap;
|
|
|
-import android.graphics.BitmapFactory;
|
|
|
-import android.graphics.Canvas;
|
|
|
-import android.graphics.Color;
|
|
|
-import android.graphics.Matrix;
|
|
|
-import android.os.Handler;
|
|
|
-import android.os.Looper;
|
|
|
-import android.util.Base64;
|
|
|
-import android.util.Log;
|
|
|
-
|
|
|
-import androidx.fragment.app.FragmentActivity;
|
|
|
-
|
|
|
-import com.caverock.androidsvg.SVG;
|
|
|
-import com.caverock.androidsvg.SVGParseException;
|
|
|
-import com.common.print.bean.PrintContentBean;
|
|
|
-import com.common.print.utils.CodeUtils;
|
|
|
-import com.telpo.tps550.api.TelpoException;
|
|
|
-import com.telpo.tps550.api.printer.UsbThermalPrinter;
|
|
|
-
|
|
|
-import java.io.ByteArrayInputStream;
|
|
|
-import java.io.InputStream;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.List;
|
|
|
-
|
|
|
-/**
|
|
|
- * 小票打印
|
|
|
- */
|
|
|
-public class PrintUtile {
|
|
|
- private static UsbThermalPrinter tps508Printer;
|
|
|
- private static List<PrintContentBean> printContentBean=new ArrayList<>();
|
|
|
- //用volatile关键字确保 instance 在多线程下的可见性
|
|
|
- private static volatile PrintUtile instance = null;
|
|
|
- private static OnPrintBaseListener listener;
|
|
|
- static Activity mActivity;
|
|
|
- //将构造方法私有化,禁止外部通过构造方法创建实例
|
|
|
- private PrintUtile() {
|
|
|
- }
|
|
|
- //提供一个公共的访问方法,用于获取该类的唯一实例
|
|
|
- public static PrintUtile getInstance(Context context) {
|
|
|
- //如果instance为空,就进行实例化
|
|
|
- if (instance == null) {
|
|
|
- //保证多线程下只有一个线程进行实例化
|
|
|
- synchronized (PrintUtile.class) {
|
|
|
- //第二次判断,避免多线程下创建多个实例
|
|
|
- if (instance == null) {
|
|
|
- instance = new PrintUtile(context);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return instance;
|
|
|
- }
|
|
|
- //构造函数私有化
|
|
|
- public PrintUtile(Context context) {
|
|
|
- if (context instanceof FragmentActivity) {
|
|
|
- this.mActivity = (Activity) context;
|
|
|
- }
|
|
|
- tps508Printer = new UsbThermalPrinter(context);
|
|
|
- }
|
|
|
- //设备上电
|
|
|
- public static void isPowerOn(){
|
|
|
- if (tps508Printer==null){
|
|
|
- return;
|
|
|
- }
|
|
|
- new Thread(new Runnable() {
|
|
|
- @Override
|
|
|
- public void run() {
|
|
|
- try {
|
|
|
- tps508Printer.start(0);
|
|
|
- } catch (TelpoException e) {
|
|
|
- // TODO Auto-generated catch block
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- Log.i("PrintUtile_isPowerOn","小票打印机上电完成");
|
|
|
-
|
|
|
- }
|
|
|
- }).start();
|
|
|
- }
|
|
|
- //打印
|
|
|
- public static void startPrint(List<PrintContentBean> printContent) {
|
|
|
- printContentBean.clear();
|
|
|
- printContentBean.addAll(printContent);
|
|
|
- new TPS508PrintThread().start();
|
|
|
- }
|
|
|
- private static class TPS508PrintThread extends Thread{
|
|
|
- @Override
|
|
|
- public void run() {
|
|
|
- // TODO Auto-generated method stub
|
|
|
- super.run();
|
|
|
- Log.e("HHArome","TPS508PrintThread.run");
|
|
|
- if (printContentBean.size()<=0){
|
|
|
- return;
|
|
|
- }
|
|
|
- String pversion,gray,sversion = null;
|
|
|
- try {
|
|
|
- tps508Printer.reset();
|
|
|
- tps508Printer.setGray(5);//设置打印灰度值 level:0-7,默认为1
|
|
|
- gray = "5";
|
|
|
- pversion = tps508Printer.getVersion();
|
|
|
- final String tempPversion = pversion;
|
|
|
- int Algin=0;
|
|
|
- int textTime=0;
|
|
|
- int imageTime=0;
|
|
|
- Log.e("HHArome","TPS508PrintThread");
|
|
|
- for (int i = 0; i < printContentBean.size(); i++) {
|
|
|
- if (printContentBean.get(i).getText()!=null
|
|
|
- &&!printContentBean.get(i).getText().equals("")){
|
|
|
- textTime+=1000;
|
|
|
- if (printContentBean.get(i).getAlgin().equals("right")){
|
|
|
- Algin=UsbThermalPrinter.ALGIN_RIGHT;
|
|
|
- } else if (printContentBean.get(i).getAlgin().equals("center")) {
|
|
|
- Algin=UsbThermalPrinter.ALGIN_MIDDLE;
|
|
|
- }else {
|
|
|
- Algin=UsbThermalPrinter.ALGIN_LEFT;
|
|
|
- }
|
|
|
- tps508Printer.setAlgin(Algin);//设置打印对齐方式
|
|
|
- tps508Printer.setTextSize(printContentBean.get(i).getTextSize());
|
|
|
- tps508Printer.addString(printContentBean.get(i).getText());
|
|
|
- tps508Printer.setBold(printContentBean.get(i).isBold());
|
|
|
- } else if (printContentBean.get(i).getQrCodeText()!=null
|
|
|
- &&!printContentBean.get(i).getQrCodeText().equals("")) {
|
|
|
- Bitmap bitmap=CodeUtils.createQRCodeBitmap(printContentBean.get(i).getQrCodeText(), 800, 800, "UTF-8", "M", "1", Color.BLACK, Color.WHITE
|
|
|
- , null, 0.2F,null);
|
|
|
- if (printContentBean.get(i).getWidth()==0){
|
|
|
- printContentBean.get(i).setWidth(376);
|
|
|
- }
|
|
|
- if (printContentBean.get(i).getHeight()==0){
|
|
|
- printContentBean.get(i).setHeight(376);
|
|
|
- }
|
|
|
- Bitmap bitmap1=zoomImg(bitmap,
|
|
|
- printContentBean.get(i).getWidth(),
|
|
|
- printContentBean.get(i).getHeight());
|
|
|
- tps508Printer.printLogo(bitmap1,true);
|
|
|
- } else if (printContentBean.get(i).getImageBase64()!=null
|
|
|
- &&!printContentBean.get(i).getImageBase64().equals("")){
|
|
|
- imageTime+=2000;
|
|
|
- //Bitmap bitmap=svgStringToBitmap(printContentBean.get(i).getImageBase64());
|
|
|
- Bitmap bitmap=stringToBitmap(printContentBean.get(i).getImageBase64());
|
|
|
-
|
|
|
- if (printContentBean.get(i).getWidth()==0){
|
|
|
- printContentBean.get(i).setWidth(376);
|
|
|
- }
|
|
|
- if (printContentBean.get(i).getHeight()==0){
|
|
|
- printContentBean.get(i).setHeight(376);
|
|
|
- }
|
|
|
- Bitmap bitmap1=zoomImg(bitmap,
|
|
|
- printContentBean.get(i).getWidth(),
|
|
|
- printContentBean.get(i).getHeight());
|
|
|
- tps508Printer.printLogo(bitmap,true);
|
|
|
- }
|
|
|
- }
|
|
|
- tps508Printer.printString();//启动打印,打印完不走纸
|
|
|
- tps508Printer.walkPaper(15);
|
|
|
- Looper.prepare();
|
|
|
- new Handler().postDelayed(new Runnable() {
|
|
|
- @Override
|
|
|
- public void run() {
|
|
|
- listener.PrintingComplete();
|
|
|
- }
|
|
|
- },textTime+imageTime);
|
|
|
- Looper.loop();
|
|
|
- Thread.sleep(30000);
|
|
|
- }
|
|
|
- catch (TelpoException e) {
|
|
|
- // TODO Auto-generated catch block
|
|
|
- e.printStackTrace();
|
|
|
- Log.e("HHArome","TelpoException");
|
|
|
- Log.e("HHArome","TelpoException--e:"+e.toString());
|
|
|
- }
|
|
|
- catch (InterruptedException e) {
|
|
|
- e.printStackTrace();
|
|
|
- Log.e("HHArome","InterruptedException");
|
|
|
- }
|
|
|
- catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- Log.e("HHArome","Exception");
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- //停止打印机服务
|
|
|
- public static void stopPrint(){
|
|
|
- tps508Printer.stop();
|
|
|
- }
|
|
|
- public static Bitmap zoomImg(Bitmap bm, int newWidth, int newHeight) {
|
|
|
- Bitmap newbm = null;
|
|
|
- if (bm != null) {
|
|
|
- // 获得图片的宽高
|
|
|
- int width = bm.getWidth();
|
|
|
- int height = bm.getHeight();
|
|
|
- // 计算缩放比例
|
|
|
- float scaleWidth = ((float) newWidth) / width;
|
|
|
- float scaleHeight = ((float) newHeight) / height;
|
|
|
- // 取得想要缩放的matrix参数
|
|
|
- Matrix matrix = new Matrix();
|
|
|
- matrix.postScale(scaleWidth, scaleHeight);
|
|
|
- // 得到新的图片
|
|
|
- newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);
|
|
|
- }
|
|
|
- return newbm;
|
|
|
- }
|
|
|
- public static Bitmap stringToBitmap(String string) {
|
|
|
- // 将字符串转换成Bitmap类型
|
|
|
- Bitmap bitmap = null;
|
|
|
- try {
|
|
|
- byte[] bitmapArray;
|
|
|
- bitmapArray = Base64.decode(string, Base64.DEFAULT);
|
|
|
- bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0,
|
|
|
- bitmapArray.length);
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- return bitmap;
|
|
|
- }
|
|
|
- public static Bitmap svgStringToBitmap(String svgString) throws SVGParseException {
|
|
|
- // 将Base64解码回字节数组
|
|
|
- byte[] decodedBytes = Base64.decode(svgString, Base64.DEFAULT);
|
|
|
-
|
|
|
- // 创建一个输入流用于读取SVG数据
|
|
|
- InputStream svgStream = new ByteArrayInputStream(decodedBytes);
|
|
|
-
|
|
|
- // 解析SVG
|
|
|
- SVG svg = null;
|
|
|
- svg = SVG.getFromInputStream(svgStream);
|
|
|
- // 获取SVG的画布尺寸
|
|
|
- int width = (int) svg.getDocumentWidth();
|
|
|
- int height = (int) svg.getDocumentHeight();
|
|
|
-
|
|
|
- // 创建一个Bitmap用于绘制SVG
|
|
|
- Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
|
|
- Canvas canvas = new Canvas(bitmap);
|
|
|
-
|
|
|
- // 在Canvas上绘制SVG
|
|
|
- svg.renderToCanvas(canvas);
|
|
|
-
|
|
|
- return bitmap;
|
|
|
- }
|
|
|
- public static void setListener(OnPrintBaseListener lister) {
|
|
|
- listener = lister;
|
|
|
- }
|
|
|
- public interface OnPrintBaseListener {
|
|
|
- void PrintingComplete();
|
|
|
- }
|
|
|
-}
|
|
|
+//package com.telpo.tps508;
|
|
|
+//
|
|
|
+//import android.app.Activity;
|
|
|
+//import android.content.Context;
|
|
|
+//import android.graphics.Bitmap;
|
|
|
+//import android.graphics.BitmapFactory;
|
|
|
+//import android.graphics.Canvas;
|
|
|
+//import android.graphics.Color;
|
|
|
+//import android.graphics.Matrix;
|
|
|
+//import android.os.Handler;
|
|
|
+//import android.os.Looper;
|
|
|
+//import android.util.Base64;
|
|
|
+//import android.util.Log;
|
|
|
+//
|
|
|
+//import androidx.fragment.app.FragmentActivity;
|
|
|
+//
|
|
|
+//import com.caverock.androidsvg.SVG;
|
|
|
+//import com.caverock.androidsvg.SVGParseException;
|
|
|
+//import com.common.print.bean.PrintContentBean;
|
|
|
+//import com.common.print.utils.CodeUtils;
|
|
|
+//import com.telpo.tps550.api.TelpoException;
|
|
|
+//import com.telpo.tps550.api.printer.UsbThermalPrinter;
|
|
|
+//
|
|
|
+//import java.io.ByteArrayInputStream;
|
|
|
+//import java.io.InputStream;
|
|
|
+//import java.util.ArrayList;
|
|
|
+//import java.util.List;
|
|
|
+//
|
|
|
+///**
|
|
|
+// * 小票打印
|
|
|
+// */
|
|
|
+//public class PrintUtile {
|
|
|
+// private static UsbThermalPrinter tps508Printer;
|
|
|
+// private static List<PrintContentBean> printContentBean=new ArrayList<>();
|
|
|
+// //用volatile关键字确保 instance 在多线程下的可见性
|
|
|
+// private static volatile PrintUtile instance = null;
|
|
|
+// private static OnPrintBaseListener listener;
|
|
|
+// static Activity mActivity;
|
|
|
+// //将构造方法私有化,禁止外部通过构造方法创建实例
|
|
|
+// private PrintUtile() {
|
|
|
+// }
|
|
|
+// //提供一个公共的访问方法,用于获取该类的唯一实例
|
|
|
+// public static PrintUtile getInstance(Context context) {
|
|
|
+// //如果instance为空,就进行实例化
|
|
|
+// if (instance == null) {
|
|
|
+// //保证多线程下只有一个线程进行实例化
|
|
|
+// synchronized (PrintUtile.class) {
|
|
|
+// //第二次判断,避免多线程下创建多个实例
|
|
|
+// if (instance == null) {
|
|
|
+// instance = new PrintUtile(context);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// return instance;
|
|
|
+// }
|
|
|
+// //构造函数私有化
|
|
|
+// public PrintUtile(Context context) {
|
|
|
+// if (context instanceof FragmentActivity) {
|
|
|
+// this.mActivity = (Activity) context;
|
|
|
+// }
|
|
|
+// tps508Printer = new UsbThermalPrinter(context);
|
|
|
+// }
|
|
|
+// //设备上电
|
|
|
+// public static void isPowerOn(){
|
|
|
+// if (tps508Printer==null){
|
|
|
+// return;
|
|
|
+// }
|
|
|
+// new Thread(new Runnable() {
|
|
|
+// @Override
|
|
|
+// public void run() {
|
|
|
+// try {
|
|
|
+// tps508Printer.start(0);
|
|
|
+// } catch (TelpoException e) {
|
|
|
+// // TODO Auto-generated catch block
|
|
|
+// e.printStackTrace();
|
|
|
+// }
|
|
|
+// Log.i("PrintUtile_isPowerOn","小票打印机上电完成");
|
|
|
+//
|
|
|
+// }
|
|
|
+// }).start();
|
|
|
+// }
|
|
|
+// //打印
|
|
|
+// public static void startPrint(List<PrintContentBean> printContent) {
|
|
|
+// printContentBean.clear();
|
|
|
+// printContentBean.addAll(printContent);
|
|
|
+// new TPS508PrintThread().start();
|
|
|
+// }
|
|
|
+// private static class TPS508PrintThread extends Thread{
|
|
|
+// @Override
|
|
|
+// public void run() {
|
|
|
+// // TODO Auto-generated method stub
|
|
|
+// super.run();
|
|
|
+// Log.e("HHArome","TPS508PrintThread.run");
|
|
|
+// if (printContentBean.size()<=0){
|
|
|
+// return;
|
|
|
+// }
|
|
|
+// String pversion,gray,sversion = null;
|
|
|
+// try {
|
|
|
+// tps508Printer.reset();
|
|
|
+// tps508Printer.setGray(5);//设置打印灰度值 level:0-7,默认为1
|
|
|
+// gray = "5";
|
|
|
+// pversion = tps508Printer.getVersion();
|
|
|
+// final String tempPversion = pversion;
|
|
|
+// int Algin=0;
|
|
|
+// int textTime=0;
|
|
|
+// int imageTime=0;
|
|
|
+// Log.e("HHArome","TPS508PrintThread");
|
|
|
+// for (int i = 0; i < printContentBean.size(); i++) {
|
|
|
+// if (printContentBean.get(i).getText()!=null
|
|
|
+// &&!printContentBean.get(i).getText().equals("")){
|
|
|
+// textTime+=1000;
|
|
|
+// if (printContentBean.get(i).getAlgin().equals("right")){
|
|
|
+// Algin=UsbThermalPrinter.ALGIN_RIGHT;
|
|
|
+// } else if (printContentBean.get(i).getAlgin().equals("center")) {
|
|
|
+// Algin=UsbThermalPrinter.ALGIN_MIDDLE;
|
|
|
+// }else {
|
|
|
+// Algin=UsbThermalPrinter.ALGIN_LEFT;
|
|
|
+// }
|
|
|
+// tps508Printer.setAlgin(Algin);//设置打印对齐方式
|
|
|
+// tps508Printer.setTextSize(printContentBean.get(i).getTextSize());
|
|
|
+// tps508Printer.addString(printContentBean.get(i).getText());
|
|
|
+// tps508Printer.setBold(printContentBean.get(i).isBold());
|
|
|
+// } else if (printContentBean.get(i).getQrCodeText()!=null
|
|
|
+// &&!printContentBean.get(i).getQrCodeText().equals("")) {
|
|
|
+// Bitmap bitmap=CodeUtils.createQRCodeBitmap(printContentBean.get(i).getQrCodeText(), 800, 800, "UTF-8", "M", "1", Color.BLACK, Color.WHITE
|
|
|
+// , null, 0.2F,null);
|
|
|
+// if (printContentBean.get(i).getWidth()==0){
|
|
|
+// printContentBean.get(i).setWidth(376);
|
|
|
+// }
|
|
|
+// if (printContentBean.get(i).getHeight()==0){
|
|
|
+// printContentBean.get(i).setHeight(376);
|
|
|
+// }
|
|
|
+// Bitmap bitmap1=zoomImg(bitmap,
|
|
|
+// printContentBean.get(i).getWidth(),
|
|
|
+// printContentBean.get(i).getHeight());
|
|
|
+// tps508Printer.printLogo(bitmap1,true);
|
|
|
+// } else if (printContentBean.get(i).getImageBase64()!=null
|
|
|
+// &&!printContentBean.get(i).getImageBase64().equals("")){
|
|
|
+// imageTime+=2000;
|
|
|
+// //Bitmap bitmap=svgStringToBitmap(printContentBean.get(i).getImageBase64());
|
|
|
+// Bitmap bitmap=stringToBitmap(printContentBean.get(i).getImageBase64());
|
|
|
+//
|
|
|
+// if (printContentBean.get(i).getWidth()==0){
|
|
|
+// printContentBean.get(i).setWidth(376);
|
|
|
+// }
|
|
|
+// if (printContentBean.get(i).getHeight()==0){
|
|
|
+// printContentBean.get(i).setHeight(376);
|
|
|
+// }
|
|
|
+// Bitmap bitmap1=zoomImg(bitmap,
|
|
|
+// printContentBean.get(i).getWidth(),
|
|
|
+// printContentBean.get(i).getHeight());
|
|
|
+// tps508Printer.printLogo(bitmap,true);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// tps508Printer.printString();//启动打印,打印完不走纸
|
|
|
+// tps508Printer.walkPaper(15);
|
|
|
+// Looper.prepare();
|
|
|
+// new Handler().postDelayed(new Runnable() {
|
|
|
+// @Override
|
|
|
+// public void run() {
|
|
|
+// listener.PrintingComplete();
|
|
|
+// }
|
|
|
+// },textTime+imageTime);
|
|
|
+// Looper.loop();
|
|
|
+// Thread.sleep(30000);
|
|
|
+// }
|
|
|
+// catch (TelpoException e) {
|
|
|
+// // TODO Auto-generated catch block
|
|
|
+// e.printStackTrace();
|
|
|
+// Log.e("HHArome","TelpoException");
|
|
|
+// Log.e("HHArome","TelpoException--e:"+e.toString());
|
|
|
+// }
|
|
|
+// catch (InterruptedException e) {
|
|
|
+// e.printStackTrace();
|
|
|
+// Log.e("HHArome","InterruptedException");
|
|
|
+// }
|
|
|
+// catch (Exception e) {
|
|
|
+// e.printStackTrace();
|
|
|
+// Log.e("HHArome","Exception");
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// //停止打印机服务
|
|
|
+// public static void stopPrint(){
|
|
|
+// tps508Printer.stop();
|
|
|
+// }
|
|
|
+// public static Bitmap zoomImg(Bitmap bm, int newWidth, int newHeight) {
|
|
|
+// Bitmap newbm = null;
|
|
|
+// if (bm != null) {
|
|
|
+// // 获得图片的宽高
|
|
|
+// int width = bm.getWidth();
|
|
|
+// int height = bm.getHeight();
|
|
|
+// // 计算缩放比例
|
|
|
+// float scaleWidth = ((float) newWidth) / width;
|
|
|
+// float scaleHeight = ((float) newHeight) / height;
|
|
|
+// // 取得想要缩放的matrix参数
|
|
|
+// Matrix matrix = new Matrix();
|
|
|
+// matrix.postScale(scaleWidth, scaleHeight);
|
|
|
+// // 得到新的图片
|
|
|
+// newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);
|
|
|
+// }
|
|
|
+// return newbm;
|
|
|
+// }
|
|
|
+// public static Bitmap stringToBitmap(String string) {
|
|
|
+// // 将字符串转换成Bitmap类型
|
|
|
+// Bitmap bitmap = null;
|
|
|
+// try {
|
|
|
+// byte[] bitmapArray;
|
|
|
+// bitmapArray = Base64.decode(string, Base64.DEFAULT);
|
|
|
+// bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0,
|
|
|
+// bitmapArray.length);
|
|
|
+// } catch (Exception e) {
|
|
|
+// e.printStackTrace();
|
|
|
+// }
|
|
|
+// return bitmap;
|
|
|
+// }
|
|
|
+// public static Bitmap svgStringToBitmap(String svgString) throws SVGParseException {
|
|
|
+// // 将Base64解码回字节数组
|
|
|
+// byte[] decodedBytes = Base64.decode(svgString, Base64.DEFAULT);
|
|
|
+//
|
|
|
+// // 创建一个输入流用于读取SVG数据
|
|
|
+// InputStream svgStream = new ByteArrayInputStream(decodedBytes);
|
|
|
+//
|
|
|
+// // 解析SVG
|
|
|
+// SVG svg = null;
|
|
|
+// svg = SVG.getFromInputStream(svgStream);
|
|
|
+// // 获取SVG的画布尺寸
|
|
|
+// int width = (int) svg.getDocumentWidth();
|
|
|
+// int height = (int) svg.getDocumentHeight();
|
|
|
+//
|
|
|
+// // 创建一个Bitmap用于绘制SVG
|
|
|
+// Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
|
|
+// Canvas canvas = new Canvas(bitmap);
|
|
|
+//
|
|
|
+// // 在Canvas上绘制SVG
|
|
|
+// svg.renderToCanvas(canvas);
|
|
|
+//
|
|
|
+// return bitmap;
|
|
|
+// }
|
|
|
+// public static void setListener(OnPrintBaseListener lister) {
|
|
|
+// listener = lister;
|
|
|
+// }
|
|
|
+// public interface OnPrintBaseListener {
|
|
|
+// void PrintingComplete();
|
|
|
+// }
|
|
|
+//}
|