目标任务: 用两台打印机分别实现打印不容的小票

1. 实体类:商品信息

/*** 商品信息类* @author admin**/
public class Commodity {// 商品名称private String name;// 商品单价private String unit_price;// 商品数量private String num;// 商品总价private String sum;public Commodity(String name, String unit_price, String num, String sum) {super();this.name = name;this.unit_price = unit_price;this.num = num;this.sum = sum;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getUnit_price() {return unit_price;}public void setUnit_price(String unit_price) {this.unit_price = unit_price;}public String getNum() {return num;}public void setNum(String num) {this.num = num;}public String getSum() {return sum;}public void setSum(String sum) {this.sum = sum;}}

2.用于打印的内容: 结账单

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
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.ArrayList;
import java.util.Calendar;
/*** 结账单* 实现Printable接口 用于创建打印内容* @author admin**/
public class CheckOutTicket implements Printable {private ArrayList<Commodity> list;//订单编号private String orders;//商品总数private String sale_num;//总金额private String sale_sum;//支付金额private String practical;//支付方式private String payMode;//字体private Font font;// 构造函数public CheckOutTicket(ArrayList<Commodity> list,String orders, String sale_num, String sale_sum,String practical,String payMode) {this.list = list;this.orders = orders;this.sale_num = sale_num;this.sale_sum = sale_sum;this.practical = practical;this.payMode = payMode;}/*** 打印方法* graphics - 用来绘制页面的上下文,即打印的图形* pageFormat - 将绘制页面的大小和方向,即设置打印格式,如页面大小一点为计量单位(以1/72 英寸为单位,1英寸为25.4毫米。A4纸大致为595 × 842点)* 小票纸宽度一般为58mm,大概为165点* pageIndex - 要绘制的页面从 0 开始的索引 ,即页号**/@Overridepublic int print(Graphics graphics, PageFormat pageFormat, int pageIndex)throws PrinterException {Component c = null;//此 Graphics2D 类扩展 Graphics 类,以提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。//它是用于在 Java(tm) 平台上呈现二维形状、文本和图像的基础类。//拿到画笔Graphics2D g2 = (Graphics2D) graphics;// 设置打印颜色为黑色g2.setColor(Color.black);// 打印起点坐标double x = pageFormat.getImageableX(); //返回与此 PageFormat相关的 Paper对象的可成像区域左上方点的 x坐标。double y = pageFormat.getImageableY(); //返回与此 PageFormat相关的 Paper对象的可成像区域左上方点的 y坐标。// 虚线float[] dash1 = { 4.0f };// width - 此 BasicStroke 的宽度。此宽度必须大于或等于 0.0f。如果将宽度设置为// 0.0f,则将笔划呈现为可用于目标设备和抗锯齿提示设置的最细线条。// cap - BasicStroke 端点的装饰// join - 应用在路径线段交汇处的装饰// miterlimit - 斜接处的剪裁限制。miterlimit 必须大于或等于 1.0f。// dash - 表示虚线模式的数组// dash_phase - 开始虚线模式的偏移量// 设置画虚线g2.setStroke(new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 4.0f, dash1, 0.0f));// 设置打印字体(字体名称、样式和磅值大小)(字体名称可以是物理或者逻辑名称)//Font.PLAIN:普通样式常量   Font.ITALIC:斜体样式常量   Font.BOLD:粗体样式常量。font = new Font("宋体", Font.PLAIN, 16);g2.setFont(font);                //设置字体float heigth = font.getSize2D();//字体高度float line = heigth;//下一行开始打印的高度//设置小票标题g2.drawString("攸之源(横岗店)", (float)x+40, (float)y+line);font = new Font("宋体",Font.BOLD,16);g2.setFont(font);heigth = font.getSize2D();//字体高度line +=heigth;//设置小票副标题g2.drawString("结账单", (float)x+65, (float)y + line);font = new Font("宋体",Font.PLAIN,16);g2.setFont(font);line =line+heigth*2;//设置小票副标题g2.drawString("桌号: 01号", (float)x, (float)y + line);font = new Font("宋体", Font.PLAIN, 10);g2.setFont(font);          // 设置字体heigth = font.getSize2D();// 字体高度line +=heigth;// 显示订单号g2.drawString("订单编号:" + orders, (float) x , (float) y + line);line+=heigth;// 显示收银员g2.drawString("下单时间:" + Calendar.getInstance().getTime().toLocaleString(), (float) x, (float) y + line);line+=heigth;g2.drawString("支付方式:" + payMode, (float) x , (float) y + line);line+=heigth;g2.drawString("支付金额:" + practical, (float) x , (float) y + line);line += heigth; //绘制虚线: (在此图形上下文的坐标系中使用当前颜色在点 (x1, y1) 和 (x2, y2) 之间画一条线。)g2.drawLine((int) x, (int) (y + line), (int) x + 180, (int) (y + line));line += heigth;  //显示标题g2.drawString("品名", (float) x , (float) y + line+5);g2.drawString("单价", (float) x + 60, (float) y + line+5);g2.drawString("数量", (float) x + 100, (float) y + line+5);g2.drawString("金额", (float) x + 150, (float) y + line+5);line = line+heigth*2;// 显示内容for (int i = 0; i < list.size(); i++) {Commodity commodity = list.get(i);g2.drawString(commodity.getName(), (float) x, (float) y + line);g2.drawString(commodity.getUnit_price(), (float) x + 60, (float) y + line);g2.drawString(commodity.getNum(), (float) x + 100, (float) y + line);g2.drawString(commodity.getSum(), (float) x + 150, (float) y + line);line += heigth;}line += heigth;        //绘制虚线g2.drawLine((int) x, (int) (y + line), (int) x + 180, (int) (y + line));line = line+heigth*2;g2.drawString("消费总金额:" + "¥" + sale_sum , (float) x+80, (float) y + line);line = line+heigth*7;//空7行g2.drawString("攸之源,健康美味之源!", (float) x + 40, (float) y + line);line += heigth;g2.drawString("横岗银信荣恒2楼", (float) x +50, (float) y + line);line += heigth;g2.drawString("0755-28912757", (float) x +50, (float) y +line);switch (pageIndex) {case 0:return PAGE_EXISTS;//0default:return NO_SUCH_PAGE;//1}}

3. 用于打印的内容: 点餐单

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
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.ArrayList;
import java.util.Calendar;
/*** 点餐单* 实现Printable接口 用于创建打印内容* @author admin**/
public class OrderDishesTicket implements Printable{private ArrayList<Commodity> list;//订单编号private String orders;//总金额private String sale_sum;//支付金额private String practical;//支付方式private String payMode;// 构造函数public OrderDishesTicket(ArrayList<Commodity> list,String orders,String sale_sum,String practical,String payMode) {this.list = list;this.orders = orders;this.sale_sum = sale_sum;this.practical = practical;this.payMode = payMode;}/*** 打印方法* graphics - 用来绘制页面的上下文,即打印的图形* pageFormat - 将绘制页面的大小和方向,即设置打印格式,如页面大小一点为计量单位(以1/72 英寸为单位,1英寸为25.4毫米。A4纸大致为595 × 842点)* 小票纸宽度一般为58mm,大概为165点* pageIndex - 要绘制的页面从 0 开始的索引 ,即页号**/@Overridepublic int print(Graphics graphics, PageFormat pageFormat, int pageIndex)throws PrinterException {Component c = null;//此 Graphics2D 类扩展 Graphics 类,以提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。//它是用于在 Java(tm) 平台上呈现二维形状、文本和图像的基础类。//拿到画笔Graphics2D g2 = (Graphics2D) graphics;// 设置打印颜色为黑色g2.setColor(Color.black);// 打印起点坐标double x = pageFormat.getImageableX(); //返回与此 PageFormat相关的 Paper对象的可成像区域左上方点的 x坐标。double y = pageFormat.getImageableY(); //返回与此 PageFormat相关的 Paper对象的可成像区域左上方点的 y坐标。// 虚线float[] dash1 = { 4.0f };// width - 此 BasicStroke 的宽度。此宽度必须大于或等于 0.0f。如果将宽度设置为// 0.0f,则将笔划呈现为可用于目标设备和抗锯齿提示设置的最细线条。// cap - BasicStroke 端点的装饰// join - 应用在路径线段交汇处的装饰// miterlimit - 斜接处的剪裁限制。miterlimit 必须大于或等于 1.0f。// dash - 表示虚线模式的数组// dash_phase - 开始虚线模式的偏移量// 设置画虚线g2.setStroke(new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 4.0f, dash1, 0.0f));// 设置打印字体(字体名称、样式和磅值大小)(字体名称可以是物理或者逻辑名称)//Font.PLAIN:普通样式常量   Font.ITALIC:斜体样式常量   Font.BOLD:粗体样式常量。Font font = new Font("宋体", Font.BOLD, 16);g2.setFont(font);               //设置字体float heigth = font.getSize2D();//字体高度float line = heigth;//下一行开始打印的高度//设置小票标题g2.drawString("【点餐分单】", (float)x+40, (float)y+line);font = new Font("宋体",Font.PLAIN,16);g2.setFont(font);line =line+heigth*2;//设置小票副标题g2.drawString("桌号: 01号", (float)x, (float)y + line);font = new Font("宋体", Font.PLAIN, 10);g2.setFont(font);        // 设置字体heigth = font.getSize2D();// 字体高度line +=heigth;// 显示订单号g2.drawString("订单编号:" + orders, (float) x , (float) y + line);line+=heigth;// 显示收银员g2.drawString("下单时间:" + Calendar.getInstance().getTime().toLocaleString(), (float) x, (float) y + line);line+=heigth;g2.drawString("支付方式:" + payMode, (float) x , (float) y + line);line+=heigth;g2.drawString("支付金额:" + practical, (float) x , (float) y + line);line += heigth; //绘制虚线: (在此图形上下文的坐标系中使用当前颜色在点 (x1, y1) 和 (x2, y2) 之间画一条线。)g2.drawLine((int) x, (int) (y + line), (int) x + 180, (int) (y + line));line += heigth;  //显示标题g2.drawString("品名", (float) x , (float) y + line+5);g2.drawString("单价", (float) x + 60, (float) y + line+5);g2.drawString("数量", (float) x + 100, (float) y + line+5);g2.drawString("金额", (float) x + 150, (float) y + line+5);line = line+heigth*2;// 显示内容for (int i = 0; i < list.size(); i++) {Commodity commodity = list.get(i);g2.drawString(commodity.getName(), (float) x, (float) y + line);g2.drawString(commodity.getUnit_price(), (float) x + 60, (float) y + line);g2.drawString(commodity.getNum(), (float) x + 100, (float) y + line);g2.drawString(commodity.getSum(), (float) x + 150, (float) y + line);line += heigth;}line += heigth;        //绘制虚线g2.drawLine((int) x, (int) (y + line), (int) x + 180, (int) (y + line));line = line+heigth*2;g2.drawString("消费总金额:" + "¥" + sale_sum , (float) x+80, (float) y + line);line = line+heigth*7;//空7行g2.drawString("攸之源,健康美味之源!", (float) x + 40, (float) y + line);line += heigth;g2.drawString("横岗银信荣恒2楼", (float) x +50, (float) y + line);line += heigth;g2.drawString("0755-28912757", (float) x +50, (float) y +line);switch (pageIndex) {case 0:return PAGE_EXISTS;//0default:return NO_SUCH_PAGE;//1}}
}

4. 打印结算单

import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.util.ArrayList;import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashAttributeSet;
import javax.print.attribute.standard.PrinterName;
/*** 打印结算单* @author admin**/
public class PrintCheckOut {//结算单,用于创建打印内容类private  CheckOutTicket salesTicket;public PrintCheckOut(CheckOutTicket salesTicket) {this.salesTicket = salesTicket;}/*** 打印结算单        */public void PrintSale() {try {//Book 类提供文档的表示形式,该文档的页面可以使用不同的页面格式和页面 painterBook book = new Book();  //要打印的文档//PageFormat类描述要打印的页面大小和方向 PageFormat pf = new PageFormat();        //初始化一个页面打印对象pf.setOrientation(PageFormat.PORTRAIT); //设置页面打印方向,从上往下// 通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。Paper paper = new Paper();paper.setSize(180, 30000);// 纸张大小paper.setImageableArea(10, 0, 180, 30000);// A4(595x842)设置打印区域,其实0,0应该是72,72,因为A4纸的默认X,Y边距是72pf.setPaper(paper);book.append(salesTicket, pf);//指定XP-80C打印机打印总单(可以省略,放在这里是为了实现多台打印机服务)HashAttributeSet hs = new HashAttributeSet();String printerName="XP-80C";hs.add(new PrinterName(printerName,null));PrintService[] pss = PrintServiceLookup.lookupPrintServices(null, hs);if(pss.length==0){System.out.println("无法找到打印机:"+printerName);return ;}// 获取打印服务对象PrinterJob printerJob = PrinterJob.getPrinterJob();// 设置打印类printerJob.setPageable(book);//添加指定的打印机printerJob.setPrintService(pss[0]);//开始打印printerJob.print();} catch (PrinterException e) {e.printStackTrace();}}}

5. 打印点餐单

import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashAttributeSet;
import javax.print.attribute.standard.PrinterName;
/*** 打印点餐单* 用HP Color LaserJet Pro MFP M176n打印机* @author admin**/
public class PrintOrderDishes {//售货单,用于创建打印内容类private  OrderDishesTicket orderFoodTicket;public PrintOrderDishes(OrderDishesTicket orderFoodTicket) {this.orderFoodTicket = orderFoodTicket;}/*** 打印点餐单          */public void PrintSale() {try {//Book 类提供文档的表示形式,该文档的页面可以使用不同的页面格式和页面 painterBook book = new Book();  //要打印的文档//PageFormat类描述要打印的页面大小和方向 PageFormat pf = new PageFormat();      //初始化一个页面打印对象pf.setOrientation(PageFormat.PORTRAIT); //设置页面打印方向,从上往下// 通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。Paper paper = new Paper();paper.setSize(180, 30000);// 纸张大小paper.setImageableArea(10, 0, 180, 30000);// A4(595x842)设置打印区域,其实0,0应该是72,72,因为A4纸的默认X,Y边距是72pf.setPaper(paper);book.append(orderFoodTicket, pf);//指定HP Color LaserJet Pro MFP M176n打印机打印总单(可以省略,放在这里是为了实现多台打印机服务)HashAttributeSet hs = new HashAttributeSet();String printerName="HP Color LaserJet Pro MFP M176n";hs.add(new PrinterName(printerName,null));PrintService[] pss = PrintServiceLookup.lookupPrintServices(null, hs);if(pss.length==0){System.out.println("无法找到打印机:"+printerName);return ;}// 获取打印服务对象PrinterJob printerJob = PrinterJob.getPrinterJob();// 设置打印类printerJob.setPageable(book);//添加指定的打印机printerJob.setPrintService(pss[0]);//开始打印printerJob.print();} catch (PrinterException e) {e.printStackTrace();}}
}

6.测试类

import java.util.ArrayList;import org.junit.Test;/*** 打印"点餐单"/"点餐单"测试(两台打印机)* @author admin*/
public class TestPrint {@Testpublic void test(){ArrayList<Commodity> cmd_list = new ArrayList<Commodity>();cmd_list.add(new Commodity("土豆", "5元", "2", "10"));cmd_list.add(new Commodity("黄瓜", "5元", "2", "10"));cmd_list.add(new Commodity("茄子", "5元", "2", "10"));// 打印结算单CheckOutTicket salesTicket = new CheckOutTicket(cmd_list,"000001", "3", "30", "30", "余额支付");PrintCheckOut pintSale = new PrintCheckOut(salesTicket);pintSale.PrintSale();//打印点餐单OrderDishesTicket oft = new OrderDishesTicket(cmd_list, "000001","30", "30", "余额支付");PrintOrderDishes printOrderFood = new PrintOrderDishes(oft);printOrderFood.PrintSale();}
}

热敏打印机 java实现根据打印机名字实现分别打印小票相关推荐

  1. java 佳博打印机,佳博蓝牙打印的java 连接

    适用于gp-3120tu机型通过蓝牙协议与android app的对接, 用的是TSC指令. package com.freestyle.demo; import android.content.In ...

  2. c# 小票打印机打条形码_C#打印小票自带条形码打印

    private void btnReceipts_Click(object sender, EventArgs e) { string sheet_no = this.dgvOrders.Select ...

  3. java 打印机类printer_GitHub - 505058216/thermal_printer: Java实现网络小票打印机自定义无驱打印...

    Java实现POS打印机自定义无驱打印 热敏打印机使用越来越广泛,而安装驱动相当复杂,万幸的是,几乎所有的热敏打印机都支持ESC/P指令,参考网络上一些资料后,在此整理了一份自定义打印的方案 • 打印 ...

  4. java 小票打印_GitHub - SubLuLu/thermal_printer: Java实现网络小票打印机自定义无驱打印...

    Java实现POS打印机自定义无驱打印 热敏打印机使用越来越广泛,而安装驱动相当复杂,万幸的是,几乎所有的热敏打印机都支持ESC/P指令,参考网络上一些资料后,在此整理了一份自定义打印的方案 • 打印 ...

  5. Java实现安卓连接商米POS收银机打印小票功能

    在收银系统中经常使用到打印小票的功能.本文将Java如何实现商米POS收银机打印小票的功能.包括""定义管理打印相关方法的类,封装好方法供外部调用"."调用打印 ...

  6. [转]Java 实现 POS 打印机无驱打印

    来源:http://www.ibm.com/developerworks/cn/java/j-lo-pos/ Java 实现 POS 打印机无驱打印 文档选项 <tr valign=" ...

  7. java实现调用打印机

    前言 在我们的实际工作中,经常需要实现打印功能.但由于历史原因,Java 提供的打印功能一直都比较弱.实际上最初的 jdk 根本不支持打印,直到 jdk1.1 才引入了很轻量的打印支持.所以,在以前用 ...

  8. java pos打印机_Java实现POS打印机自定义无驱打印

    热敏打印机使用越来越广泛,而安装驱动相当复杂,万幸的是,几乎所有的热敏打印机都支持ESC/P指令,参考网络上一些资料后,在此整理了一份自定义打印的方案 • 打印模板为了增强打印效果的通用性,因此需要提 ...

  9. java socket 打印机_思普瑞特,小票打印机和标签打印机java网络驱动设计与实现...

    网络打印走的socket连接,主流的java, php, c, c#等语言都支持socket,所以实现打印机的网络打印几乎是和语言无关的 打印机默认端口是9100 使用socket连接上打印机后,将打 ...

最新文章

  1. Git命令家底儿及Git数据通信原理详解
  2. java爬取百度首页源代码
  3. 软件详细设计说明书_校导周绪龙|软件测试第五篇——软件测试的底层思维
  4. 德州阿尔法计算机技术有限公司,德州扑克被人工智能完美攻陷 为什么比阿尔法狗还值得关注?...
  5. ITK:相同类型的多个输入
  6. 码农和程序员等的差别
  7. 阿里P8架构师谈:MongoDB、Hbase、Redis等NoSQL优劣势、应用场景
  8. C/C++中Windows API 简单的(Callback)回调机制
  9. Rstudio更换主题/样式
  10. Linux 重启php
  11. linux之lsof使用技巧
  12. element ui 表格滚动条抖动的问题
  13. VS2013 update4+Cocos2d-x 3.7 Win8下安装方法及配置
  14. PS纯色图标更换颜色
  15. QQ安装目录内的文件及子目录的详细作用
  16. Android使用xml自定义软键盘效果(附源码)
  17. 数据分析 - 关于彩票中奖结果的数据分析猜想(一)
  18. Win10安装cuda11.1和cudnn8.0
  19. R语言GD包地理探测器分析时报错、得不到结果等情况的解决方案
  20. 虚拟机ubuntu访问PC文件

热门文章

  1. LeetCode-Revers_Bits
  2. gitlab合并错代码还原命令
  3. php+vue 南天在线求助系统
  4. ml基础算法参数设置
  5. 刚刚拿下「中国AI最高奖」的语音技术,能给我们带来什么?
  6. stm32复用时钟AFIO什么时候开启
  7. 为什么服务器未响应ins,9修复Instagram无法正常工作,加载或崩溃的最佳方法
  8. Sina微博开放API代理设置
  9. Vmware WorkStation(中文名“威睿工作站”) 网卡图解
  10. 人工智能换脸python_Python实现AI换脸功能