2009-05-21 38 views
1

我正在通過機場將複雜的搖擺應用程序UI打印到物理打印機。我已經有Mac & Windows機器都打印到同一臺打印機。從Mac打印看起來很棒。從窗口打印看起來很不錯 - 一切都非常像素化,包括字體和圖形線條。從Mac和Windows上的swing打印 - postscript支持在哪裏?

一些挖掘顯示可用PrintServices是不同的平臺。

DocFlavor flavor = DocFlavor.INPUT_STREAM.POSTSCRIPT; 
PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet(); 
PrintServiceLookup.lookupPrintServices(flavor, attrs); 

從mac執行時,上面返回一個單元素數組。從窗口,它返回一個空數組。這導致我相信Windows正在向打印機發送一個72 DPI圖像,而不是PostScript數據。

這是不同的Windows JVM實現嗎?是否有任何解決方法可以在Windows上打印?我意識到我可以生成自己的350dpi光柵化圖像並將其發送給打印機,但這些內容會進入數百頁,如果可能的話,我真的很想避開那條路徑。

+0

我偶然發現了這個問題,我知道這是一個古老而你可能意識到了這一點,但是第二行代碼是不必要的, `lookupPrintServices`允許第二個參數爲`null`,以防你不需要設置屬性。 – 2017-11-13 13:55:06

回答

1

想想我得到了一個答案:java.awt.printerjob系統屬性設置爲sun.awt.windows.WPrinterJob。顯然這是一個方便的PrinterJob子類,如果你喜歡你的打印機上的塊狀像素化輸出。相反,我得到的sun.print.PSPrinterJob一個實例,如果它是可用的,就像這樣:

PrinterJob printerJob = null; 
try { 
    if (System.getProperty("java.awt.printerjob").equals("sun.awt.windows.WPrinterJob")) { 
     // WPrinterJob sends crappy GIF images to the printer, and everything looks all blocky 
     // try to get an instance of a PSPrinterJob instead 
     printerJob = (PrinterJob) Class.forName("sun.print.PSPrinterJob").newInstance(); 
    } 
} catch (Throwable e1) { 
    log.log(Level.SEVERE, "Could not instaniate sun.print.PSPrinterJob", e1); 
} 
if (printerJob == null) { 
     printerJob = PrinterJob.getPrinterJob(); 
} 
+0

僅供參考,Mac上的Java 8似乎將此值設置爲`sun.lwawt.macosx.CPrinterJob` – tresf 2016-03-22 16:53:27