java.awt.print.Printable、PrinterJob、PrintJob(AWT 簡易列印)。javax.print.*,統一列印服務發現、屬性、事件、文件風味,支援更豐富的列印場景。Printable 或 Toolkit.getPrintJob();JPS 用 PrintServiceLookup.lookupDefaultPrintService()。PrinterJob.print() 或 DocPrintJob.print(doc, attributes)。| 特性 | PrinterJob.printDialog() | ServiceUI.printDialog() |
|---|---|---|
| 來源 | JDK 1.1 AWT | JDK 1.4 JPS |
| 預設行為 | 顯示對話框 | 預設不顯示,需程式碼主動呼叫 |
| 頁數預估 | 需自行計算或用 Book 傳遞 | 同樣需應用層計算 |
Printablepublic int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException {
Graphics2D g2 = (Graphics2D) g;
if (pageIndex >= totalPages) return NO_SUCH_PAGE; // 結束
g2.translate(pf.getImageableX(), pf.getImageableY()); // 原點平移到可列印區
drawPageContent(g2, pf, pageIndex); // 繪製當頁內容
return PAGE_EXISTS; // 繼續下一頁
}
預先將完整文字按「每頁 54 行」切分成 String[] pages,getPagesCount() 回傳總頁數供 pageIndex 判斷。
PrinterJob.getPrinterJob().setPrintable(this, pf); if (job.printDialog()) job.print();DocFlavor.SERVICE_FORMATTED.PRINTABLE + SimpleDoc(this, flavor, das) + DocPrintJob.print(doc, pras)。原理:print() 只是將內容繪製到 Graphics 物件。預覽時將 Graphics2D 導向螢幕元件,並套用縮放與平移,讓整頁 A4 適配螢幕矩形。
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
PageFormat pf = PrinterJob.getPrinterJob().defaultPage();
double scale = Math.min(getWidth()/pf.getWidth(), getHeight()/pf.getHeight());
g2.translate(offsetX, offsetY);
g2.scale(scale, scale);
// 繪製頁框背景
g2.setPaint(Color.WHITE); g2.fill(pageRect);
g2.setPaint(Color.BLACK); g2.draw(pageRect);
// 呼叫同一個 print() 邏輯繪製指定頁
printable.print(g2, pf, currentPage);
}
翻頁只需更新 currentPage 並 repaint()。
Component.printAll(Graphics g) 會遞迴繪製元件樹。搭配 AWT Toolkit.getPrintJob() 取得 PrintJob 與 Graphics:
PrintJob pj = Toolkit.getDefaultToolkit().getPrintJob(frame, "Title", props);
Graphics pg = pj.getGraphics();
frame.printAll(pg);
pg.dispose();
pj.end();
適合快速列印表單、報表畫面,但精細排版控制力較弱。
JPS 提供 DocFlavor.INPUT_STREAM.* 系列,自動匹配列印服務支援的格式:
JFileChooser fc = new JFileChooser();
if (fc.showOpenDialog(this) == APPROVE_OPTION) {
File file = fc.getSelectedFile();
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE; // 自動偵測
PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, null);
PrintService svc = ServiceUI.printDialog(null, 200, 200, services, defaultSvc, flavor, null);
if (svc != null) {
DocPrintJob job = svc.createPrintJob();
Doc doc = new SimpleDoc(new FileInputStream(file), flavor, null);
job.print(doc, null);
}
}
已知格式請指定具體 DocFlavor(如 INPUT_STREAM.PDF、INPUT_STREAM.GIF、INPUT_STREAM.TEXT_PLAIN_US_ASCII),提高成功率。
Printable 實作,確保所見即所得。PrintRequestAttributeSet 設定。