Java调用不同的打印机实现打印不同小票

Java调用不同的打印机实现打印不同小票

前言,在餐馆中,为了满足商家的需要,当顾客下订单后,前台打印机需要打印出订单的信息给顾客,后台打印机需要打印出菜品分单给厨师。怎么样让一台计算机来控制多台打印机同时完成打印任务呢。下面来解释。
调用打印机:

package com.yjy.ticket;

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 com.yjy.pojo.Food;
import utils.TimeUtils;

/**
* 点餐单内容
* 实现Printable接口 用于创建打印内容
* @author admin
*
*/
public class CustomerTicket implements Printable {
/*食物列表/
private ArrayList list;
/*订单编号/
private String orders;
/*支付时间/
private String payTime;
/*桌号/
private String deskNumber;
/*排号/
private String descNumber;

// 构造函数
public CustomerTicket(ArrayList<Food> list) {
    super();
    this.list = list;
}

public CustomerTicket() {
}

/**
* 打印方法
* 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;

    //  桌号和排号都为空,此行不打印
    if (deskNumber == null && descNumber == null) {
        g2.drawString("", (float)x, (float)y + line);
        //  桌号为空,则显示排号
    } else if (deskNumber == null) {
        g2.drawString("排号: "+descNumber+"号", (float)x, (float)y + line);
        //  排号为空,则显示桌号
    } else if(descNumber == null) {
        g2.drawString("桌号: "+deskNumber+"号", (float)x, (float)y + line);
    }else{
        g2.drawString("桌号: "+deskNumber+"号", (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("下单时间:" + TimeUtils.time(payTime), (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 + 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++) {
        Food food = list.get(i);
        g2.drawString(food.getName(), (float) x, (float) y + line);
        g2.drawString(food.getNumber(), (float) x + 100, (float) y + line);
        g2.drawString(food.getSpe(),(float) x + 150, (float) y + line);
        line += heigth;
    }

    line += heigth;     
    //绘制虚线
    g2.drawLine((int) x, (int) (y + line), (int) x + 180, (int) (y + line));

    switch (pageIndex) {
    case 0:
        return PAGE_EXISTS;//0
    default:
        return NO_SUCH_PAGE;//1

    }
}

public ArrayList<Food> getList() {
    return list;
}

public void setList(ArrayList<Food> list) {
    this.list = list;
}

public String getOrders() {
    return orders;
}

public void setOrders(String orders) {
    this.orders = orders;
}

public String getPayTime() {
    return payTime;
}

public void setPayTime(String payTime) {
    this.payTime = payTime;
}

public String getDeskNumber() {
    return deskNumber;
}

public void setDeskNumber(String deskNumber) {
    this.deskNumber = deskNumber;
}

public String getDescNumber() {
    return descNumber;
}

public void setDescNumber(String descNumber) {
    this.descNumber = descNumber;
}

}

    调用打印机:

package com.edu.print;

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;

import com.yjy.ticket.CustomerTicket;
/**
* 打印点餐单(菜品)
* @author admin
*
*/
public class PrintCustomer {

//点餐单,用于创建打印内容类
private  CustomerTicket customer;

public PrintCustomer(CustomerTicket customer) {
    this.customer = customer;
}

/**
 * 打印点餐单
 *            
 */
public void PrintCustomer() {
    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(customer, 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 job = PrinterJob.getPrinterJob();
        // 设置打印类
        job.setPageable(book);
        //添加指定的打印机
        job.setPrintService(pss[0]);
        //开始打印
        job.print();
    } catch (PrinterException e) {
        e.printStackTrace();
    }
}

}
“`
执行打印任务:
PrintCustomer printCustomer = new PrintCustomer(customerTicket);
printCustomer.PrintCustomer();
完结

猜你喜欢

转载自blog.csdn.net/Irelia_/article/details/81563185
今日推荐