首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 列印程式設計完全攻略

     編輯:Java 程式設計入門

前言

實務工作中常需實作列印功能。因歷史原因,Java 列印功能長期較弱。早期 JDK 完全不支援列印,直到 JDK 1.1 才引入輕量級列印支援。過去複雜列印多透過 ActiveX/OCX 控制項或 VB/VC 程式實現,相當麻煩。Sun 公司持續改進 Java 列印功能,Java 2 平台終於有健全列印模型的開端,與 Java 2D 圖形套件完美整合。更令人振奮的是,新發布的 JDK 1.4 提供完整的「Java 列印服務 API」,對既有列印功能是積極補充。利用它可實現大部分實務需求,包括列印文字、圖形、檔案及列印預覽等。本文將透過具體程式範例說明如何設計 Java 列印程式實現這些功能,並對不同版本實作方法進行分析比較,希望讀者能獲得有益啟發。

Java 中的列印

1. Java 列印 API

Java 列印 API 主要位於 java.awt.print 套件。JDK 1.4 新增類別主要位於 javax.print 及其子套件 javax.print.event 和 javax.print.attribute。其中 javax.print 主要包含列印服務相關類別,javax.print.event 包含列印事件定義,javax.print.attribute 則包含列印服務可用屬性列表等。

2. 如何實現列印

要產生列印,至少需考慮兩點:

  • 需要列印服務物件: JDK 1.4 前必須實作 java.awt.print.Printable 介面,或透過 Toolkit.getDefaultToolkit().getPrintJob 取得;JDK 1.4 則可透過 javax.print.PrintServiceLookup 查找定位列印服務物件。
  • 需要開始一個列印工作: JDK 1.4 前可透過 java.awt.print.PrintJob(JDK 1.1 提供,現較少用)呼叫 print 或 printAll 方法;也可透過 java.awt.print.PrinterJob 的 printDialog 顯示列印對話框,再呼叫 print 方法;JDK 1.4 則可透過 javax.print.ServiceUI 的 printDialog 顯示列印對話框,再呼叫 print 方法開始列印工作。

3. 列印機對話框

3.1 Printable 的列印對話框

開始列印工作前,可透過 PrinterJob.printDialog 顯示列印對話框,讓使用者選擇列印頁碼範圍、更改列印設定。這是原生對話框。實際上,從 Printable 物件進行列印工作時,列印物件不知道需列印多少頁,只會持續呼叫 print 方法,只要回傳 Printable.PAGE_EXISTS 就持續產生頁面,直到回傳 Printable.NO_SUCH_PAGE 才停止。由於列印完成後才能準確計算頁數,對話框上的頁碼範圍預設為 [1, 9999]。可透過建構 java.awt.print.Book 物件傳遞給列印物件,或透過指定格式計算頁數傳遞給列印物件,使其準確知道頁數。

3.2 ServiceUI 的列印對話框

與 Printable 不同,JDK 1.4 提供的 ServiceUI 列印對話框預設行為已改變:預設不顯示。必須使用 ServiceUI 類別呼叫 printDialog 方法建立列印對話框。

Java 列印程式設計實例

1. 列印文字

1.1 應用場景

假設需列印視窗中某文字編輯區(可能只有幾行,也可能多頁)的內容,每頁最多列印 54 行,如何實現?

1.2 解決方法

基本思路:實作 Printable 介面,按每頁 54 行格式計算總頁數;列印按鈕被點擊時執行列印動作。具體列印操作可透過 Graphics2D 的 drawString 方法實現。

1) 實作 Printable 介面


/* 
Graphics 指明列印圖形環境;
PageFormat 指明列印頁格式(頁面大小以點為單位,1 點 = 1/72 英寸,1 英寸 = 25.4 毫米。A4 紙約 595×842 點);
page 指明頁號
*/
public int print(Graphics g, PageFormat pf, int page) throws PrinterException {
    Graphics2D g2 = (Graphics2D) g;
    g2.setPaint(Color.black); // 設定列印顏色為黑色
    if (page >= PAGES) // 當列印頁碼大於總頁數時,列印工作結束
        return Printable.NO_SUCH_PAGE;
    g2.translate(pf.getImageableX(), pf.getImageableY()); // 轉換座標,確定列印邊界
    drawCurrentPageText(g2, pf, page); // 列印當前頁文字
    return Printable.PAGE_EXISTS; // 存在列印頁時,繼續列印工作
}

/* 列印指定頁碼的具體文字內容 */
private void drawCurrentPageText(Graphics2D g2, PageFormat pf, int page) {
    String s = getDrawText(printStr)[page]; // 取得當前頁待列印文字內容
    // 取得預設字體及相應尺寸
    FontRenderContext context = g2.getFontRenderContext();
    Font f = area.getFont();
    String drawText;
    float ascent = 16; // 給定字元點陣
    int k, i = f.getSize(), lines = 0;
    while (s.length() > 0 && lines < 54) { // 每頁限定在 54 行以內
        k = s.indexOf('\n'); // 取得每一個換行符位置
        if (k != -1) { // 存在換行符
            lines++; // 計算行數
            drawText = s.substring(0, k); // 取得每一行文字
            g2.drawString(drawText, 0, ascent); // 具體列印每一行文字,同時走紙移位
            if (s.substring(k + 1).length() > 0) {
                s = s.substring(k + 1); // 截取尚未列印的文字
                ascent += i;
            }
        } else { // 不存在換行符
            lines++; // 計算行數
            drawText = s; // 取得每一行文字
            g2.drawString(drawText, 0, ascent); // 具體列印每一行文字,同時走紙移位
            s = ""; // 文字已結束
        }
    }
}
  • 首頁
  • 上一頁
  • 1
  • 2
  • 3
  • 4
  • 下一頁
  • 尾頁
  • 共4頁
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved