android连接小票打印机,打印小票数据的两种模式
为了开发android无线点餐系统,需要用到打印小票任务,根据网上查找资料所得,学习了两种方法,一种为通过tomcat服务连接服务器所连接的打印机打印,一种为直接连接网络打印机打印
一、通过tomcat服务连接服务器所连接的打印机打印
手机或平板是一种移动设备,不可能直接打印机,所以要把打印的数据发给tomcat,通过服务器电脑打印
先定义一个javabean实体类,用来保存数据
public class FoodChoose implements Serializable{int id;String tablename;String foodname;int foodnum;//数量int foodunitprice;//单价 public FoodChoose() {super();}public FoodChoose(String tablename, String foodname, int foodnum,int foodunitprice) {super();this.tablename = tablename;this.foodname = foodname;this.foodnum = foodnum;this.foodunitprice = foodunitprice;}public FoodChoose(int id, String tablename, String foodname, int foodnum,int foodunitprice) {super();this.id = id;this.tablename = tablename;this.foodname = foodname;this.foodnum = foodnum;this.foodunitprice = foodunitprice;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getTablename() {return tablename;}public void setTablename(String tablename) {this.tablename = tablename;}public String getFoodname() {return foodname;}public void setFoodname(String foodname) {this.foodname = foodname;}public int getFoodnum() {return foodnum;}public void setFoodnum(int foodnum) {this.foodnum = foodnum;}public int getFoodunitprice() {return foodunitprice;}public void setFoodunitprice(int foodunitprice) {this.foodunitprice = foodunitprice;}@Overridepublic String toString() {return "FoodChoose [id=" + id + ", tablename=" + tablename+ ", foodname=" + foodname + ", foodnum=" + foodnum+ ", foodunitprice=" + foodunitprice + "]";}
再定义一个打印类Prient implements Printable,在这个类里实现打印格式调整,以及数据获取
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.util.List;import vo.FoodChoose;public class Prient implements Printable { String tablename,places,total,receiveprice,change;List<FoodChoose> lists;int heightIndex;public Prient(String tablename,String places,String total,String receiveprice,String change,List<FoodChoose> lists) {System.out.println("Prient构造方法");this.tablename = tablename;this.places = places;this.total = total;this.receiveprice = receiveprice;this.change = change;this.lists = lists;}@Override public int print(Graphics g, PageFormat pf, int page) throws PrinterException { System.out.println("----print----");heightIndex = -20;if (page > 0) { return NO_SUCH_PAGE; } Graphics2D g2d = (Graphics2D) g; g2d.setFont(new Font("Default", Font.PLAIN, 14)); g2d.drawString("天龙餐饮(消费清单)", 50, 12); g2d.setFont(new Font("Default", Font.PLAIN, 16)); g2d.drawString("台号:"+places+"-"+tablename, 52, 30); g2d.setFont(new Font("Default", Font.PLAIN, 10)); g2d.drawString("流水号:123456"+" "+Content.getNowTime(), 30, 45); g2d.setFont(new Font("Default", Font.PLAIN, 12)); g2d.drawString("- - - - - - - - - - - - - - - - - - - - - -", 30, 55); g2d.drawString("- - - - - - - - - - - - - - - - - - - - - -", 30, 58); g2d.drawString("项目" + " "+"数量" + " "+"单价" + " "+"小计", 30, 70); g2d.drawString("- - - - - - - - - - - - - - - - - - - - - -", 30, 80);System.out.println("xxxxxxxxxxxxxxxxxxxxx");for (FoodChoose f : lists) {heightIndex = heightIndex+20;System.out.println("lists大小="+lists.size());System.out.println("aa打印菜名="+f.getFoodname());double price = f.getFoodnum() * f.getFoodunitprice();//小计if(f.getFoodname().length()==2){g2d.drawString(f.getFoodname() + Content.two1+f.getFoodnum() + Content.two2+f.getFoodunitprice() + Content.two3+ price+"元", 30, 90+heightIndex); }else if(f.getFoodname().length()==3){g2d.drawString(f.getFoodname() + Content.three1+f.getFoodnum() + Content.three2+f.getFoodunitprice() + Content.three3+ price+"元", 30, 90+heightIndex); }else if(f.getFoodname().length()==4){g2d.drawString(f.getFoodname() + Content.four1+f.getFoodnum() + Content.four2+f.getFoodunitprice() + Content.four3+ price+"元", 30, 90+heightIndex); }else if(f.getFoodname().length()==5){g2d.drawString(f.getFoodname() + Content.five1+f.getFoodnum() + Content.five2+f.getFoodunitprice() + Content.five3+ price+"元", 30, 90+heightIndex); }}// g2d.drawString("荷包蛋" + " "+"2" + " "+"1" + " "+"2元", 30, 90);
// g2d.drawString("鱼片粥" + " "+"2" + " "+"6" + " "+"12元", 30,110);
// g2d.drawString("白粥" + " "+"1" + " "+"2" + " "+"2元", 30, 130);
// g2d.drawString("黑椒牛肉" + " "+"1" + " "+"25" + " "+"25元", 30, 150);
// g2d.drawString("河鱼河虾煲" + " "+"1" + " "+"20" + " "+"20元", 30, 170); g2d.drawString("- - - - - - - - - - - - - - - - - - - - - -", 30, 90+heightIndex+10); g2d.drawString(" "+"总计: "+total, 30, 90+heightIndex+20); g2d.drawString("- - - - - - - - - - - - - - - - - - - - - -", 30, 90+heightIndex+30); g2d.drawString(" "+"收款: "+receiveprice, 30, 90+heightIndex+40); g2d.drawString(" "+"找零: "+change, 30, 90+heightIndex+60); g2d.drawString("服务员:" + "001"+" " + "收银员:" + "002", 30, 90+heightIndex+80);g2d.drawString("- - - - - - - - - - - - - - - - - - - - - -", 30, 90+heightIndex+90); g2d.drawString("- - - - - - - - - - - - - - - - - - - - - -", 30, 90+heightIndex+93); g2d.drawString("欢迎光临,谢谢惠顾", 60, 90+heightIndex+113); g2d.drawString("服务电话:13888888888", 50, 90+heightIndex+133); System.out.println("mmmmmmmmmmmmmmmmmmmmmmmm");return PAGE_EXISTS; }
}
最后要自定义一个方法,调用上面的打印工具类
public static void print(String tablename,String places,String total,String receiveprice,String change,List<FoodChoose> lists){System.out.println("Content.print");// int height = 1000 + 3 * 15 + 20; int height = 1000; // 通俗理解就是书、文档 Book book = new Book(); // 打印格式 PageFormat pf = new PageFormat(); pf.setOrientation(PageFormat.PORTRAIT); // 通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。 Paper p = new Paper(); p.setSize(230, height); p.setImageableArea(5, -20, 230, height + 20); pf.setPaper(p); // 把 PageFormat 和 Printable 添加到书中,组成一个页面 book.append(new Prient(tablename,places,total,receiveprice,change,lists), pf); // 获取打印服务对象 PrinterJob job = PrinterJob.getPrinterJob(); job.setPageable(book); try { job.print();System.out.println("开始打印");} catch (PrinterException e) { System.out.println("================打印出现异常"); } }
通过以上的代码,就可以实现在javaEE中通过tomcat打印(连接tomcat的代码,在这就不写了)
第二种方法,直接连接网络打印机(需要该打印机支持网线连接),还要求手机或平板所连接的网必须和打印机处于同一个网络字段
String PRINTER_IP = "192.168.2.223";//网络打印要ip地址,端口用9100即可
先要设定一个打印工具类pos
public class Pos { //定义编码方式 private static String encoding = null; private Socket sock = null; // 通过socket流进行读写 private OutputStream socketOut = null; private OutputStreamWriter writer = null; /** * 初始化Pos实例 * * @param ip 打印机IP * @param port 打印机端口号 * @param encoding 编码 * @throws IOException */ public Pos(String ip, int port, String encoding) throws IOException { sock = new Socket(ip, port); socketOut = new DataOutputStream(sock.getOutputStream()); this.encoding = encoding; writer = new OutputStreamWriter(socketOut, encoding); } /** * 关闭IO流和Socket * * @throws IOException */ public void closeIOAndSocket() throws IOException { writer.close(); socketOut.close(); sock.close(); } /** * 打印二维码 * * @param qrData 二维码的内容 * @throws IOException */ public void qrCode(String qrData) throws IOException { int moduleSize = 8; int length = qrData.getBytes(encoding).length; //打印二维码矩阵 writer.write(0x1D);// init writer.write("(k");// adjust height of barcode writer.write(length + 3); // pl writer.write(0); // ph writer.write(49); // cn writer.write(80); // fn writer.write(48); // writer.write(qrData); writer.write(0x1D); writer.write("(k"); writer.write(3); writer.write(0); writer.write(49); writer.write(69); writer.write(48); writer.write(0x1D); writer.write("(k"); writer.write(3); writer.write(0); writer.write(49); writer.write(67); writer.write(moduleSize); writer.write(0x1D); writer.write("(k"); writer.write(3); // pl writer.write(0); // ph writer.write(49); // cn writer.write(81); // fn writer.write(48); // m writer.flush(); } /** * 进纸并全部切割 * * @return * @throws IOException */ public void feedAndCut() throws IOException { writer.write(0x1D); writer.write(86); writer.write(65); // writer.write(0); //切纸前走纸多少 writer.write(100); writer.flush(); //另外一种切纸的方式 // byte[] bytes = {29, 86, 0}; // socketOut.write(bytes); } /** * 打印换行 * * @return length 需要打印的空行数 * @throws IOException */ public void printLine(int lineNum) throws IOException { for (int i = 0; i < lineNum; i++) { writer.write("\n"); } writer.flush(); } /** * 打印换行(只换一行) * * @throws IOException */ public void printLine() throws IOException { writer.write("\n"); writer.flush(); } /** * 打印空白(一个Tab的位置,约4个汉字) * * @param length 需要打印空白的长度, * @throws IOException */ public void printTabSpace(int length) throws IOException { for (int i = 0; i < length; i++) { writer.write("\t"); } writer.flush(); } /** * 打印空白(一个汉字的位置) * * @param length 需要打印空白的长度, * @throws IOException */ public void printWordSpace(int length) throws IOException { for (int i = 0; i < length; i++) { writer.write(" "); } writer.flush(); } /** * 打印位置调整 * * @param position 打印位置 0:居左(默认) 1:居中 2:居右 * @throws IOException */ public void printLocation(int position) throws IOException { writer.write(0x1B); writer.write(97); writer.write(position); writer.flush(); } /** * 绝对打印位置 * * @throws IOException */ public void printLocation(int light, int weight) throws IOException { writer.write(0x1B); writer.write(0x24); writer.write(light); writer.write(weight); writer.flush(); } /** * 打印文字 * * @param text * @throws IOException */ public void printText(String text) throws IOException { String s = text; byte[] content = s.getBytes("gbk"); socketOut.write(content); socketOut.flush(); } /** * 新起一行,打印文字 * * @param text * @throws IOException */ public void printTextNewLine(String text) throws IOException { //换行 writer.write("\n"); writer.flush(); String s = text; byte[] content = s.getBytes("gbk"); socketOut.write(content); socketOut.flush(); } /** * 初始化打印机 * * @throws IOException */ public void initPos() throws IOException { writer.write(0x1B); writer.write(0x40); writer.flush(); } /** * 加粗 * * @param flag false为不加粗 * @return * @throws IOException */ public void bold(boolean flag) throws IOException { if (flag) { //常规粗细 writer.write(0x1B); writer.write(69); writer.write(0xF); writer.flush(); } else { //加粗 writer.write(0x1B); writer.write(69); writer.write(0); writer.flush(); } }
下面就可以调用打印工具类pos实现网络打印
/*** 直接连接网络打印机打印,不需要tomcat,暂时不用*/public void testPrint() {System.out.println("测试打印");// 开启一个子线程new Thread() {public void run() {try {pos = new Pos(Content.PRINTER_IP, 9100, "GBK"); // 第一个参数是打印机网口IP// 初始化打印机pos.initPos();// 初始化订单数据initData();pos.bold(true);pos.printTabSpace(2);//两个tab距离,一个tab=4个汉字pos.printWordSpace(1);//一个汉字距离pos.printText("**测试店铺");pos.printLocation(0);//打印位置调整 pos.printTextNewLine("----------------------------------------");pos.bold(false);pos.printTextNewLine("订 单 号:1005199");pos.printTextNewLine("用 户 名:15712937281");pos.printTextNewLine("桌 号:3号桌");pos.printTextNewLine("订单状态:订单已确认");pos.printTextNewLine("订单日期:2016/2/19 12:34:53");pos.printTextNewLine("付 款 人:线下支付(服务员:宝哥)");pos.printTextNewLine("服 务 员:1001");pos.printTextNewLine("订单备注:不要辣,少盐");pos.printLine(2);pos.printText("项目");pos.printLocation(20, 1);pos.printText("单价");pos.printLocation(99, 1);pos.printWordSpace(1);pos.printText("数量");pos.printWordSpace(3);pos.printText("小计");pos.printLocation(0);//打印位置调整 pos.printTextNewLine("----------------------------------------");for (FoodChoose foods : foodChoose) {pos.printTextNewLine(foods.getFoodname());pos.printLocation(20, 1);pos.printText(foods.getFoodunitprice()+"");pos.printLocation(99, 1);pos.printWordSpace(1);pos.printText(foods.getFoodnum()+"");pos.printWordSpace(3);}pos.printTextNewLine("----------------------------------------------");//pos.printLocation(1);//pos.printLine(2);// 打印二维码//pos.qrCode("http://blog.csdn.net/haovip123");// 切纸//pos.feedAndCut();pos.closeIOAndSocket();pos = null;} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}.start();}private void initData() { foodChoose = new ArrayList<FoodChoose>(); for (int i = 0; i < 4; i++) { FoodChoose fb = new FoodChoose(); fb.setFoodname("测试菜品" + i); fb.setFoodunitprice(90); fb.setFoodnum(2); foodChoose.add(fb); } }
android连接小票打印机,打印小票数据的两种模式相关推荐
- mui android连接蓝牙打印机打印
android设备连蓝牙打印机打印,代码如下: mui.plusReady(function(){ main = plus.android.runtimeMainActivi ...
- NWJS(NodeJS)调用打印机 - 打印小票
1 背景 架构设计:VueJS + Spring Cloud微服务架构 功能要求: 调用小票打印机打印小票,功能和超市收银结算功能相同 使用NWJS包装VueJS前端代码实现exe安装包和可执行文件 ...
- delphi android 打印机,用delphi控制小票打印机打印图片
用delphi控制小票打印机打印图片 unit PosPrintBmp; {************************************************************** ...
- 转:C#并口热敏小票打印机打印位图
最近一直在研究并口小票打印机打印图片问题,这也是第一次和硬件打交道,不过还好,最终成功了. 这是DEMO的窗体: 下面是打印所需要调用的代码: [html] view plain copy class ...
- C# 热敏打印机 小票打印机 打印图片
最近一直在研究并口小票打印机打印图片问题,这也是第一次和硬件打交道,不过还好,最终成功了. 这是DEMO的窗体: 下面是打印所需要调用的代码: class LptControl { private s ...
- C#并口热敏小票打印机打印位图
C#并口热敏小票打印机打印位图 原文:C#并口热敏小票打印机打印位图 最近一直在研究并口小票打印机打印图片问题,这也是第一次和硬件打交道,不过还好,最终成功了. 这是DEMO的窗体: 下面是打印所需要 ...
- 常见小票打印机打印故障及解决方法汇总视频教程
通过对"常见小票打印机故障及解决方法汇总视频教程"课程学习,达到以下目的:1.可以独立自主安装打印机驱动以及安装打印机硬件设备 2.可以独立自主排除常见打印机故障 学习教程 常见小 ...
- 常见小票打印机打印故障及解决方法汇总视频教程-王西猛-专题视频课程
常见小票打印机打印故障及解决方法汇总视频教程-548人已学习 课程介绍 通过对"常见小票打印机故障及解决方法汇总视频教程"课程学习,达到以下目的:1.可以独立自主安 ...
- uni-app H5+ 连接蓝牙打印机打印文字及二维码
基于Native.js 实现的连接蓝牙打印机 打印效果图 核心代码 测试代码 运行设备及环境 PS: PPS: Demo 打印效果图 核心代码 /*** @Description: 蓝牙打印类 基于h ...
最新文章
- 线程池 c linux 编程,关于c++:linux-c编程之高效线程池如何实现无琐化
- mysql表中有重复的元组_MySQL查询找到重复的元组并显示计数?
- linux脚本的数据输出到excel,使用shell实现Excel表格导出功能 | 剑花烟雨江南
- 讲讲python使用xpath中遇到[Element a at 0x39a9a80到底是什么
- JMM模型到并发编程
- 分成互质组 (信息学奥赛一本通-T1221)
- windows-7:系统利用终端cmd命令关机
- Linux定时任务cron及部分Linux命令
- 【279天】每日项目总结系列017(2017.11.11)
- 35道常见的前端vue面试题
- win10专业版有必要吗_Win10有哪些版本 Win10各版本有什么区别【区别介绍】
- jmeter 接口测试 签名_JMeter处理接口签名(sign)
- 知识那么多,作为一个IT人我们该怎样有效的学习?
- configure详解
- 常用oracle命令
- 第三章 View的基本概念
- 1月16日服务器维护,1月16日服务器维护公告
- 对synchronized(this)的一些理解
- 盒式交换机和框式交换机的区别
- 做虾皮跨境电商的注意事项——扬帆牧哲