Java學習之打印功能

    在很多應用中,需要把程序中生成的圖表等文件通過打印機打印出來。需要調用出來windows中的打印機對話框,選擇打印機,打印的份數等信息,然後把java中組織的要打印的信息,讓打印機打印出來。

1、java中打印流程

PrinterJob類是控制打印的主要類,Java應用程序可以調用此類中的方法實現設置打印任務、打開“打印”對話框、執行頁面打印等任務。本節將介紹控制打印任務的常用方法。

1).獲取PrinterJob對象

PrinterJob job = PrinterJob.getPrinterJob();

2).打印任務的名稱屬性

job.setJobName("打印圖形");  //會顯示在打印任務列表當中,區分不同的打印任務

3).設置打印頁面

job.setPrintable(new Printable() {

}

4).獲取打印用戶

job.getUserName();

5).打印狀態

job.isCancelled()

6). 其他:

if (!job.printDialog()) //調出打印對話框
    return;

job.print();//實現打印功能

2、設置打印頁面

打印頁面是指打印任務要執行打印的內容,這些內容可以是文本、圖片、網頁和圖形等,在第26章中所講的所有繪圖內容都可以作爲打印內容。打印內容必須實現Printable接口,該接口位於java.awt.print包中,接口中只包含一個方法。

語法如下:

print(Graphics graphics, PageFormat pageFormat, int pageIndex)

graphics:繪製打印頁面的圖形上下文。

pageFormat:將繪製打印頁面的格式屬性,如方向和大小。

pageIndex:當前打印頁的索引。

下面舉一個例子:

PrinterJob job = PrinterJob.getPrinterJob();
if (!job.printDialog())
	return;
job.setPrintable(new Printable() {
	private final int OVAL_WIDTH = 130; // 圓形的寬
	private final int OVAL_HEIGHT = 130; // 圓形的高
	
	public int print(Graphics graphics, PageFormat pageFormat,
			int pageIndex) throws PrinterException {
		if (pageIndex > 0)
			return Printable.NO_SUCH_PAGE;
		int x = (int) pageFormat.getImageableX();
		int y = (int) pageFormat.getImageableY();
		System.out.print("x:"+ x +"y:"+y);
		Graphics2D g2 = (Graphics2D) graphics;
		g2.setStroke(new BasicStroke(4.0F));
		g2.setColor(Color.BLUE);
		// 繪製1個圓形
		g2.drawOval(x + 10, y + 10, OVAL_WIDTH, OVAL_HEIGHT); 
		g2.setColor(Color.CYAN);
		return Printable.PAGE_EXISTS;
	}
});
job.setJobName("打印圖形");
job.print();
} catch (PrinterException e) {
e.printStackTrace();
}

3、多頁打印

雖然實現Printable接口並重寫print()方法,可以實現自己的打印頁對象,但是在實際的程序開發中經常需要進行多頁打印,這就需要使用java.awt.print包所提供的Book類對多個打印頁進行封裝。使用Book類的append()方法可以將多個打印頁面添加到Book類的實例對象中,這可以看作是爲一本書添加多個章節和頁碼。該方法有兩種重載形式。語法如下:

append(Printable painter, PageFormat page)或append(Printable painter, PageFormat page, int numPages)

painter:實現Printable接口的類,也就是打印頁。

page:將繪製打印頁面的格式屬性,如方向和大小。

numPages:要添加到Book中的頁數

static class PrintPage implements Printable {
	public int print(Graphics graphics, PageFormat pageFormat,
			int pageIndex) throws PrinterException {
		// 獲取可打印區域座標的X位置
		int x = (int) pageFormat.getImageableX();
		// 獲取可打印區域座標的Y位置
		int y = (int) pageFormat.getImageableY();
		Graphics2D g2 = (Graphics2D) graphics;
		// 繪製文本
		g2.drawString("多頁打印實例的第" + pageIndex + "頁", x, y + 10);
		return Printable.PAGE_EXISTS; // 返回PAGE_EXISTS
	}
}

public static void main(String[] args) {
	try {
		PrinterJob job = PrinterJob.getPrinterJob();
		if (!job.printDialog()) // 如果取消打印對話框
			return; // 終止方法執行
		Book printBook = new Book();
		PageFormat pf = new PageFormat();
		printBook.append(new PrintPage(), pf); // 添加1頁
		printBook.append(new PrintPage(), pf, 5); // 添加5頁
		job.setPageable(printBook); // 設置打印頁
		job.setJobName("多頁打印"); // 設置打印任務名稱
		job.print(); // 執行打印
	} catch (PrinterException e) {
		e.printStackTrace();
	}
}

4、打印預覽

打印預覽機制使用戶可以在打印之前,在屏幕上查看要打印的內容及打印樣式,從而避免錯誤打印而造成紙張浪費。各類辦公軟件、圖像處理軟件等都提供打印預覽功能,而Java Swing技術並沒有提供打印預覽對話框組件,本節將介紹如何實現自己的打印預覽機制。

Printable接口的print()方法中,操作的graphics是打印機的圖形上下文對象。打印預覽的實現原理就是將該圖形上下文替換爲程序界面的圖形上下文,在組件的paint()方法中調用Printable接口的print()方法即可實現打印預覽。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章