为了开发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连接小票打印机,打印小票数据的两种模式相关推荐

  1. mui android连接蓝牙打印机打印

    android设备连蓝牙打印机打印,代码如下:  mui.plusReady(function(){             main = plus.android.runtimeMainActivi ...

  2. NWJS(NodeJS)调用打印机 - 打印小票

    1 背景 架构设计:VueJS + Spring Cloud微服务架构 功能要求: 调用小票打印机打印小票,功能和超市收银结算功能相同 使用NWJS包装VueJS前端代码实现exe安装包和可执行文件 ...

  3. delphi android 打印机,用delphi控制小票打印机打印图片

    用delphi控制小票打印机打印图片 unit PosPrintBmp; {************************************************************** ...

  4. 转:C#并口热敏小票打印机打印位图

    最近一直在研究并口小票打印机打印图片问题,这也是第一次和硬件打交道,不过还好,最终成功了. 这是DEMO的窗体: 下面是打印所需要调用的代码: [html] view plain copy class ...

  5. C# 热敏打印机 小票打印机 打印图片

    最近一直在研究并口小票打印机打印图片问题,这也是第一次和硬件打交道,不过还好,最终成功了. 这是DEMO的窗体: 下面是打印所需要调用的代码: class LptControl { private s ...

  6. C#并口热敏小票打印机打印位图

    C#并口热敏小票打印机打印位图 原文:C#并口热敏小票打印机打印位图 最近一直在研究并口小票打印机打印图片问题,这也是第一次和硬件打交道,不过还好,最终成功了. 这是DEMO的窗体: 下面是打印所需要 ...

  7. 常见小票打印机打印故障及解决方法汇总视频教程

    通过对"常见小票打印机故障及解决方法汇总视频教程"课程学习,达到以下目的:1.可以独立自主安装打印机驱动以及安装打印机硬件设备 2.可以独立自主排除常见打印机故障 学习教程 常见小 ...

  8. 常见小票打印机打印故障及解决方法汇总视频教程-王西猛-专题视频课程

    常见小票打印机打印故障及解决方法汇总视频教程-548人已学习 课程介绍         通过对"常见小票打印机故障及解决方法汇总视频教程"课程学习,达到以下目的:1.可以独立自主安 ...

  9. uni-app H5+ 连接蓝牙打印机打印文字及二维码

    基于Native.js 实现的连接蓝牙打印机 打印效果图 核心代码 测试代码 运行设备及环境 PS: PPS: Demo 打印效果图 核心代码 /*** @Description: 蓝牙打印类 基于h ...

最新文章

  1. 线程池 c linux 编程,关于c++:linux-c编程之高效线程池如何实现无琐化
  2. mysql表中有重复的元组_MySQL查询找到重复的元组并显示计数?
  3. linux脚本的数据输出到excel,使用shell实现Excel表格导出功能 | 剑花烟雨江南
  4. 讲讲python使用xpath中遇到[Element a at 0x39a9a80到底是什么
  5. JMM模型到并发编程
  6. 分成互质组 (信息学奥赛一本通-T1221)
  7. windows-7:系统利用终端cmd命令关机
  8. Linux定时任务cron及部分Linux命令
  9. 【279天】每日项目总结系列017(2017.11.11)
  10. 35道常见的前端vue面试题
  11. win10专业版有必要吗_Win10有哪些版本 Win10各版本有什么区别【区别介绍】
  12. jmeter 接口测试 签名_JMeter处理接口签名(sign)
  13. 知识那么多,作为一个IT人我们该怎样有效的学习?
  14. configure详解
  15. 常用oracle命令
  16. 第三章 View的基本概念
  17. 1月16日服务器维护,1月16日服务器维护公告
  18. 对synchronized(this)的一些理解
  19. 盒式交换机和框式交换机的区别
  20. 做虾皮跨境电商的注意事项——扬帆牧哲

热门文章

  1. android自定义控件padding属性无效的解决
  2. 100句你读到哪句最心疼?
  3. 2021网易秋招笔试题(Android开发)
  4. 如何看hbo_如何取消您的HBO Now帐户
  5. MAC地址IP地址 端口
  6. 大佬总结的4条宝贵经验,送给初入职场的你,从此一飞冲天
  7. Pig 更新: 发布 0.7 版本
  8. python中的if判断,和while循环的用法
  9. MOT 指标汇总 (详讲 说明 含义 )
  10. ps4如何通过虚拟服务器联机,PS4联机路由电信用自定义host