1. 程式人生 > >JAVA 呼叫印表機輸出PDF檔案

JAVA 呼叫印表機輸出PDF檔案

想利用java程式列印一些檔案。做以下測試:

一、環境

要呼叫印表機輸出檔案,首先本地得有一個能正常使用的印表機。我電腦安裝的是虛擬印表機。

二、java程式碼

一)、列印輸出的實體類

import java.io.Serializable;
import java.util.Date;
/**
 * @Author: ykbian
 * @Date: 2018/10/24 9:22
 * @Todo: 列印的員工資訊實體類
 */
public class Persion implements Serializable {


    private static final long serialVersionUID = 1L;
    private String userName;        //姓名
    private String gender;          //性別
    private String nation;          // 民族
    private String address;        //住址
    private String IDNumber;        //身份證號碼
    private int    age;            //啟用日期
    private String qrCodePath;        //頭像
    private Date   birthday;

    // 以下是get方法、set方法和兩個建構函式,省略
}

二)、工具類及測試


/**
 * @Author: ykbian
 * @Date: 2018/10/24 9:24
 * @Todo: 列印的工具類
 */
public class PrintUtil implements Printable {

//    身份證:長度85.6毫米,寬度54毫米,厚度0.9毫米
    //待列印資料的條數,此變數需定義在資料集合之前
    private static int COUNT = 0;
    //待列印的文字資料
    private static List<Persion> STUDENT_LIST = getStudent();
    //日期格式
    private static SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");


   /**
    *@Author:      ykbian
    *@date_time:   2018/10/24 13:41
    *@Description:  重寫Printable 的print()方法
    *@param:      Graphic指明列印的圖形環境
    *             PageFormat指明列印頁格式(頁面大小以點為計量單位,1點為1英寸的1/72,1英寸為25.4毫米。A4紙大致為595×842點)
    *             pageIndex指明頁號
   */
    @Override
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
        Component c = null;
        //轉換成Graphics2D
        Graphics2D g2 = (Graphics2D) graphics;
        //設定列印顏色為黑色
        g2.setColor(Color.BLACK);
        //列印起點座標
        double x = pageFormat.getImageableX();
        double y = pageFormat.getImageableY();
        switch (pageIndex) {
            case 0:
                //設定列印字型(字型名稱、樣式和點大小)(字型名稱可以是物理或者邏輯名稱)
                //Java平臺所定義的五種字體系列:Serif、SansSerif、Monospaced、Dialog 和 DialogInput
                Font font = new Font("新宋體", Font.PLAIN, 20);
                //設定字型
                g2.setFont(font);
                float[] dash1 = {2.0f};
                //設定列印線的屬性。
                //1.線寬 2、3、不知道,4、空白的寬度,5、虛線的寬度,6、偏移量
                g2.setStroke(new BasicStroke(0.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 2.0f, dash1, 0.0f));

                //獲取需要列印的圖片,若是動態生成,直接傳入絕對路徑即可
                Image src = Toolkit.getDefaultToolkit().getImage(STUDENT_LIST.get(COUNT).getQrCodePath());
                System.out.println(STUDENT_LIST.get(COUNT).getQrCodePath());
                if (src == null) {
                    System.out.println("沒有找到影象");
                }
                // 圖片的座標(x,y)寬,高
                g2.drawImage(src,(int)120,(int)150,(int)136,(int)220,c);
                //標題,固定不變
                g2.drawString(STUDENT_LIST.get(COUNT).getTitle(), (float) 250, (float)100);
                //以下為動態的文字內容
                font = new Font("新宋體", Font.ROMAN_BASELINE, 15);
                g2.setFont(font);
                g2.drawString("姓名:" + STUDENT_LIST.get(COUNT).getUserName(), (float) 50, (float) 150);
                g2.drawString("性別:" + STUDENT_LIST.get(COUNT).getGender(), (float) 50, (float) 170);
                g2.drawString("民族:" + STUDENT_LIST.get(COUNT).getNation(), (float) 50, (float) 190);
                g2.drawString("住址:" + STUDENT_LIST.get(COUNT).getAddress(), (float) 50, (float) 210);
                g2.drawString("路徑:" + STUDENT_LIST.get(COUNT).getQrCodePath(), (float) 50, (float) 230);
                g2.drawString("身份證號碼:" + STUDENT_LIST.get(COUNT).getIDNumber(), (float) 50, (float) 250);
                g2.drawString("出生日期:" + FORMAT.format(STUDENT_LIST.get(COUNT).getBirthday()), (float) 50, (float) 280);
                return PAGE_EXISTS;
            default:
                return NO_SUCH_PAGE;
        }

    }

    /**
     * 封裝測試資料
     *
     * @return
     */
    private static List<Persion> getStudent() {
        List<Persion> dtos = new ArrayList<>();
        dtos.add(new Persion("姜子牙", "男", "漢", "岐山縣", "622222111111111111", 800, "E:\\test\\jzy.jpg", new Date(), "居民身份證"));
        dtos.add(new Persion("楊戩", "男", "漢", "岐山縣", "622222111111111111", 800, "E:/test/jzy.jpg", new Date(), "居民身份證"));
        dtos.add(new Persion("哪吒", "男", "漢", "岐山縣", "622222111111111111", 800, "E:/test/jzy.jpg", new Date(), "居民身份證"));
        dtos.add(new Persion("雷震子", "男", "漢", "岐山縣", "622222111111111111", 800, "E:/test/jzy.jpg", new Date(), "居民身份證"));
        dtos.add(new Persion("哮天犬", "男", "漢", "岐山縣", "622222111111111111", 800, "E:/test/jzy.jpg", new Date(), "居民身份證"));
//
        if (dtos.size() > 0) {
            COUNT = dtos.size() - 1;
            System.out.println("總共需列印" + (COUNT + 1) + "次");
        }
        return dtos;
    }

    public static void main(String[] args) {
        //    通俗理解就是書、文件
        Book book = new Book();
        //    設定成豎打()
        PageFormat pf = new PageFormat();
        pf.setOrientation(PageFormat.PORTRAIT);
        //    通過Paper設定頁面的空白邊距和可列印區域。必須與實際列印紙張大小相符。
        Paper p = new Paper();
        //紙張大小
        p.setSize(1000, 618);
        // 頁面可列印的區域大小(左上角定位,引數分別是x軸,y軸,寬度和長度)
        p.setImageableArea(15, 15, 800, 600);
        pf.setPaper(p);
        //    把 PageFormat 和 Printable 新增到書中,組成一個頁面
        book.append(new PrintUtil(), pf);
        //獲取列印服務物件
        PrinterJob job = PrinterJob.getPrinterJob();
        // 設定列印類
        job.setPageable(book);
        try {
            if (STUDENT_LIST.size() > 0) {
                for (int i = 0; i < STUDENT_LIST.size(); i++) {
                    job.print();
                    --COUNT;
                }
            }
        } catch (PrinterException e) {
            e.printStackTrace();
        }
    }
}

三、輸出結果

執行程式,輸出結果如下:

然而,還是存在一些問題,圖片列印失敗。不知道為什麼… …

四、原始碼

五、鳴謝

參考文章: