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

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. 主流机器学习[xgb, lgb, Keras, LR]
  2. CocoaPods管理iOS的第三方类库
  3. 文巾解题 11. 盛最多水的容器
  4. 从未后悔认识你,只是不知如何面对分开的结局
  5. CRM中间件里parent not ok的错误消息如何处理
  6. 看懂别人的代码,只是成为高效程序员的第一步!
  7. sqlserver——视图
  8. 敏捷实践的价值观和方法论
  9. AD中如何查看快捷键
  10. idea导入spring源码_Spring源码入门到放弃(一):环境准备
  11. 考研复习(8)-图的基本操作
  12. RGB_LED,WS2811彩带驱动设计
  13. Python可视化 | 风玫瑰图可视化示例
  14. android极光推送设置消息类型,详解极光推送的 4 种消息形式—— Android 篇
  15. pg 备份恢复(四)—— 逻辑备份(dump与copy导入导出)
  16. Little Keng
  17. 高逼格技能教你玩转Excel
  18. MySQL学习笔记——20170811
  19. 怎么让笔记本变路由器,亲身试验可用,不用下第三方软件
  20. IE8上面的旋转和透明度,利用滤镜属性去处理(兼容css3的transform和rgba())

热门文章

  1. 中国下一代互联网(CNGI)建设市场投资前景预测与发展战略规划研究报告2021~2027年
  2. 《乔布斯传》圈点(末篇)
  3. 什么是“Ground truth”
  4. S7 A7 K7 V7区别
  5. number-precision--使用/实例
  6. nrf52832 学习笔记(七)蓝牙协议层级理解
  7. 正点原子STM32F103精英版学习笔记(二)
  8. AndroidStudio近场通信
  9. 洛谷 P3014 [USACO11FEB]牛线Cow Line
  10. leetcode五月每日一题 leetcode974