使用Printable操作打印机

需求:使用《web、手机端》点击打印可以直接使用打印机打印出来。

1.jdk1.8中有个Printable类,实现这个类,就可以。具体上代码:

  

package com.contractor.utils;

import com.contractor.models.ContractorWorkInfo;
import com.jfinal.kit.StrKit;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.awt.print.*;
import java.io.File;
import java.io.IOException;

import static java.lang.Character.isLetter;

/**
 * 操作打印机
 */
public class PrintJob implements Printable {
    // 无参构造
    public PrintJob() {

    }

    private ContractorWorkInfo workInfo;
    private String imgPath;

    public String getImgPath() {
        return imgPath;
    }

    public void setImgPath(String imgPath) {
        this.imgPath = imgPath;
    }

    public ContractorWorkInfo getWorkInfo() {
        return workInfo;
    }

    public void setWorkInfo(ContractorWorkInfo workInfo) {
        this.workInfo = workInfo;
    }

    // 有参构造
    public PrintJob(ContractorWorkInfo workInfo, String imgPath) {
        this.workInfo = workInfo;
        this.imgPath = imgPath;
    }

    /**
     * @param graphics   指明打印图像环境
     * @param pageFormat 指明打印页格式(页面大小以点为计量单位,1点为1英才的1/72,1英寸为25.4毫米。A4纸大致为595×842点)
     * @param pageIndex  指明页号
     */
    @Override
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
        Graphics2D g2 = (Graphics2D) graphics;
        // 黑色
        g2.setColor(Color.BLACK);
        //打印起点坐标
        double x = 20;
        double y = 60;
        int default_height = 16;
        Component c = null;
        switch (pageIndex) {
            case 0:
                Font font = null;
                //矩形(外边框)
                Rectangle2D rect = new Rectangle2D.Double(30, 30, 520, 704);//声明并创建矩形对象,矩形的左上角是(20,30),宽是300,高是40
                g2.draw(rect);

                font = new Font("新宋体", Font.BOLD, 25);
                g2.setFont(font);//设置字体
                g2.drawString("施工信息", (float) x + 210, (float) y);

                Line2D line = new Line2D.Double(30, y + 5 + default_height, 550, y + 5 + default_height);
                g2.draw(line);
                g2.drawString("", (float) x + 25, (float) y - 10 + default_height * 2);//空行

                font = new Font("新宋体", Font.PLAIN, 13);
                g2.setFont(font);//设置字体
                g2.drawString("承包商:" + workInfo.getStr("contractorName"), (float) x + 25, (float) y + default_height * 3);
                g2.drawString("施工日期:" + workInfo.getStr("createtime").substring(0,10), (float) x + 25, (float) y + default_height * 5);
                g2.drawString("施工区域:" + workInfo.getStr("areaname"), (float) x + 25, (float) y + default_height * 7);
                g2.drawString("施工生产线:" + workInfo.getStr("productlinename"), (float) x + 25, (float) y + default_height * 9);
                g2.drawString("工作类型:" +workInfo.getStr("workmaintypes") +"—"+  workInfo.getStr("worktypes"), (float) x + 25, (float) y + default_height * 11);
                g2.drawString("工作内容:" + workInfo.getStr("credentials"), (float) x + 25, (float) y + default_height * 13);
                g2.drawString("施工人数:" + workInfo.getInt("units"), (float) x + 25, (float) y + default_height * 15);
                String titles = nullToBlank(workInfo.getStr("titles"));
                String workers = nullToBlank(workInfo.getStr("workers"));
                if (StrKit.notBlank(workers)){
                    int length = workers.length();
                    if (length<=35){
                        g2.drawString("施工人员:" + workers, (float) x + 25, (float) y + default_height *17);
                        if (StrKit.notBlank(titles)){
                            int titlesLength = titles.length();
                            if (titlesLength<=32){
                                g2.drawString("施工描述:" + titles, (float) x + 25, (float) y + default_height * 19);
                            }else if (titlesLength<=64){
                                String titlesSub1 = titles.substring(0, 32);
                                String titlesSub2 = titles.substring(32, titles.length());
                                g2.drawString("施工描述:" + titlesSub1, (float) x + 25, (float) y + default_height *19);
                                g2.drawString("         "+titlesSub2, (float) x + 27, (float) y + default_height *20);
                            }else if (titlesLength<=96){
                                String titlesSub1 = titles.substring(0, 32);
                                String titlesSub2 = titles.substring(32, 64);
                                String titlesSub3 = titles.substring(64, titles.length());
                                g2.drawString("施工描述:" + titlesSub1, (float) x + 25, (float) y + default_height *19);
                                g2.drawString("        "+titlesSub2, (float) x + 27, (float) y + default_height *20);
                                g2.drawString("        "+titlesSub3, (float) x + 27, (float) y + default_height *21);
                            }else if (titlesLength<=128){
                                String titlesSub1 = titles.substring(0, 32);
                                String titlesSub2 = titles.substring(32, 64);
                                String titlesSub3 = titles.substring(64, 96);
                                String titlesSub4 = titles.substring(96, titles.length());
                                g2.drawString("施工描述:" + titlesSub1, (float) x + 25, (float) y + default_height *21);
                                g2.drawString("        "+titlesSub2, (float) x + 27, (float) y + default_height *22);
                                g2.drawString("        "+titlesSub3, (float) x + 27, (float) y + default_height *23);
                                g2.drawString("        "+titlesSub4, (float) x + 27, (float) y + default_height *24);
                            }
                        }
                    }else {
                        String workersSub1 = workers.substring(0, 35);
                        String workersSub2 = workers.substring(35, workers.length());
                        g2.drawString("施工人员:" + workersSub1, (float) x + 25, (float) y + default_height *17);
                        g2.drawString("        "+workersSub2, (float) x + 27, (float) y + default_height *19);
                        if (StrKit.notBlank(titles)){
                            int titlesLength = titles.length();
                            if (titlesLength<=32){
                                g2.drawString("施工描述:" + titles, (float) x + 25, (float) y + default_height * 21);
                            }else if (titlesLength<=64){
                                String titlesSub1 = titles.substring(0, 32);
                                String titlesSub2 = titles.substring(32, titles.length());
                                g2.drawString("施工描述:" + titlesSub1, (float) x + 25, (float) y + default_height *21);
                                g2.drawString("         "+titlesSub2, (float) x + 27, (float) y + default_height *22);
                            }else if (titlesLength<=96){
                                String titlesSub1 = titles.substring(0, 32);
                                String titlesSub2 = titles.substring(32, 64);
                                String titlesSub3 = titles.substring(64, titles.length());
                                g2.drawString("施工描述:" + titlesSub1, (float) x + 25, (float) y + default_height *21);
                                g2.drawString("        "+titlesSub2, (float) x + 27, (float) y + default_height *22);
                                g2.drawString("        "+titlesSub3, (float) x + 27, (float) y + default_height *23);
                            }else if (titlesLength<=128){
                                String titlesSub1 = titles.substring(0, 32);
                                String titlesSub2 = titles.substring(32, 64);
                                String titlesSub3 = titles.substring(64, 96);
                                String titlesSub4 = titles.substring(96, titles.length());
                                g2.drawString("施工描述:" + titlesSub1, (float) x + 25, (float) y + default_height *21);
                                g2.drawString("        "+titlesSub2, (float) x + 27, (float) y + default_height *22);
                                g2.drawString("        "+titlesSub3, (float) x + 27, (float) y + default_height *23);
                                g2.drawString("        "+titlesSub4, (float) x + 27, (float) y + default_height *24);
                            }
                        }
                    }
                }


                // 下划线
                Line2D lineBottom = new Line2D.Double(30, y + 5 + default_height * 25, 550, y + 5 + default_height * 25);
                g2.draw(lineBottom);
                font = new Font("新宋体", Font.PLAIN, 11);
                g2.setFont(font);//设置字体
                g2.drawString("请打开HUA的专用APP MyPlant,使用承包商管理中的扫码功能", (float) x + 25, (float) y + default_height * 35);
                g2.drawString("扫描该二维码以获取更多施工信息或对本次施工进行反馈。", (float) x + 25, (float) y + default_height * 36);
                try {
                    BufferedImage read = ImageIO.read(new File(imgPath));
                    int img_Height = read.getHeight(c);
                    g2.drawImage(read, (int) x + 360, img_Height + 400, c);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return PAGE_EXISTS;
            default:
                return NO_SUCH_PAGE;
        }
    }
    /**
     * 将null转换成"",并且将Object转换成String类型
     * @param  oTempObject:输入的Object对象
     **/
    public static String nullToBlank(Object oTempObject){
        try{
            if (oTempObject==null){
                return "";
            }
            else{
                return oTempObject.toString();
            }
        }
        catch(Exception e){
        }
        return "";
    }

    /**
     * 调用打印
     */
    public static void callPrint(ContractorWorkInfo contractorWorkInfo, String imgPath) {
        // book类提供的文档,不同的页面格式和页面painter。
        Book book = new Book();
        // 要打印的页面大小和方向
        PageFormat pageFormat = new PageFormat();
        // 页面打印的顺序
        pageFormat.setOrientation(PageFormat.PORTRAIT);
        // 使用paper设置打印页面大小
        Paper paper = new Paper();
        // 纸张大小
        paper.setSize(590, 835);
        // 设置文章区域
        paper.setImageableArea(10, 10, 580, 844);
        pageFormat.setPaper(paper);

        // 传入自定义数据
        book.append(new PrintJob(contractorWorkInfo, imgPath), pageFormat);
        // 调用打印
        PrinterJob printerJob = PrinterJob.getPrinterJob();
        // 设置打印类
        printerJob.setPageable(book);
        try {
            // 开始打印
            printerJob.print();
        } catch (PrinterException e) {
            e.printStackTrace();
        }

    }
}

2.相应的代码解释:

2.1:实现Printable就会重写print。

2.2它通过Graphics2D进行绘制,有字体、大小、颜色等操作

2.3 drawString:要输入的内容,x,y是作用在坐标点。

 

posted @ 2022-05-19 17:18  胜过这首歌  阅读(294)  评论(0编辑  收藏  举报
AmazingCounters.com