Java早期打印支持薄弱:1.0無打印,1.1引入PrintJob粗糙不可靠,1.2提供PrinterJob與java.awt.print(Java2D Printing API),但仍受限於Graphics圖形繪製、無法程序化選擇打印機、屬性設置有限。J2SE 1.3擴展JobAttributes/PageAttributes,問題依存。J2SE 1.4引入javax.print包(Java Print Service API)徹底改變局面,突破舊有限制,成為當前標準。
PrintServiceLookup.lookupPrintServices(flavor, attributes),按文檔風味(DocFlavor)與屬性集篩選支持的打印機。DocPrintJob job = service.createPrintJob()。Doc接口封裝數據(如SimpleDoc),可選構建PrintRequestAttributeSet指定份數、雙面、頁邊距等。job.print(doc, attributeSet)。DocFlavor由MIME類型+表示類組成。預定義靜態內部類覆蓋常見組合:
| 表示類 | 對應內部類 | 典型MIME示例 |
|---|---|---|
| byte[] | DocFlavor.BYTE_ARRAY | GIF, JPEG, PNG, POSTSCRIPT, TEXT_PLAIN |
| InputStream | DocFlavor.INPUT_STREAM | 同上 |
| URL | DocFlavor.URL | 同上 |
| char[] | DocFlavor.CHAR_ARRAY | TEXT_PLAIN, TEXT_HTML |
| Reader | DocFlavor.READER | 同上 |
| String | DocFlavor.STRING | TEXT_PLAIN, TEXT_HTML |
| 可打印服務格式化 | DocFlavor.SERVICE_FORMATTED | PAGEABLE, PRINTABLE, RENDERABLE_IMAGE |
例如:DocFlavor flavor = DocFlavor.URL.GIF; 表示通過URL打印GIF圖片。
直接傳遞DocFlavor給lookupPrintServices,僅返回支持該格式的服務:
DocFlavor flavor = DocFlavor.INPUT_STREAM.PDF;
PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, null);
for (PrintService svc : services) System.out.println(svc.getName());
若不指定風味(null,null)則列出所有可用打印機。
使用HashPrintRequestAttributeSet添加標準屬性:
PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
attrs.add(new Copies(2));
attrs.add(Sides.DUPLEX);
attrs.add(MediaSizeName.ISO_A4);
job.print(doc, attrs);
JPS將文檔格式、打印機能力、作業屬性解耦,提供工業級打印解決方案,完全取代舊有PrintJob/PrinterJob機制。