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

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

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 开始的索引 ,即页号
	**/
	@Override
	public 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;//0
		default:
			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 开始的索引 ,即页号
	**/
	@Override
	public 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;//0
		default:
			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 类提供文档的表示形式,该文档的页面可以使用不同的页面格式和页面 painter
			Book 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边距是72
			pf.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 类提供文档的表示形式,该文档的页面可以使用不同的页面格式和页面 painter
				Book 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边距是72
				pf.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 {
	
	@Test
	public 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();
	}
}

 

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值