2012-01-18 68 views
3

我一直在試圖確定打印機是否能夠打印PostScript(.PS)的文件。使用下面的方法,我試圖確定打印機是否可以用下面的代碼打印後記:確定PostScript打印支持

private void findPrinters(DocFlavor flav) { 
    PrintService[] services = PrintServiceLookup.lookupPrintServices(flav, null); 

    System.out.println(flav); 
    if (services != null && services.length != 0) { 
    System.out.println("SUPPORTED:"); 
    for (PrintService service : services) { 
     System.out.println(service); 
    } 
    } else { 
    System.out.println("NOT SUPPORTED"); 
    } 
} 

我通過它DocFlavor.INPUT_STREAM.POSTSCRIPTDocFlavor.BYTE_ARRAY.POSTSCRIPT,它會返回Win32 Printer : HP LaserJet 2300L PSWin32 Printer : CutePDF Writer(這兩者都是「虛擬」打印機 - 前者用於創建PDF,後者用於創建Postscript)。安裝「適用於Windows PostScript的HP通用打印驅動程序」後,Win32 Printer : HP Universal Printing PS顯示爲Postscript功能。但是,我不確定此驅動程序是否正在使用,因此我認爲這是因爲沒有其他連接的打印機可以打印Postscript文件。

然後我試圖PostScript文件饋送到一對夫婦連接的打印機的用以下示例代碼:

FileInputStream in = null; 
PrintService prnSvc = PrintServiceLookup.lookupDefaultPrintService(); 
DocPrintJob printJob = prnSvc.createPrintJob(); 
Doc doc; 

in = new FileInputStream("some.ps"); 

if (prnSvc.isDocFlavorSupported(DocFlavor.INPUT_STREAM.POSTSCRIPT)) { 
    /* USE THIS FOR A PS-capable printer */ 
    doc = new SimpleDoc(in, DocFlavor.INPUT_STREAM.POSTSCRIPT, null); 
} else { 
    /* USE THIS FOR OTHER PRINTER */ 
    doc = new SimpleDoc(in, DocFlavor.INPUT_STREAM.AUTOSENSE, null); 
} 

printJob.print(doc, null); 

這將在後記功能的打印機正確打印以及網絡打印機之一(一Java說的HP LaserJet P4014N)沒有Postscript支持。在我的收據打印機上,它將打印Postscript文件,就像它只是文本一樣。有人向我建議,網絡打印機沒有正確響應Java(通用驅動程序等),並且它實際上可以支持Postscript。我查看過文檔,但無法確定LaserJet P4014N是否支持Postscript。我確實找到另一臺打印機(HP Laserjet 2055dn),並通過USB連接到我的電腦,Java仍然報告說它不支持Postscript,儘管能夠使用上述方法打印它。

也許我做錯了什麼?如果不是,我該如何正確檢測打印機是否支持Postscript?我的最終目標是確定打印機是否支持Postscript,如果它不將Postscript轉換爲JPG(分辨率損失,但源代碼有圖像)並打印出來。如果您有任何關於將Postscript文件打印到不支持Postscript功能的打印機的建議,我很樂意聽到它!如果您需要更多信息,請告訴我。

我發現了一些樣品Postscript文件here,你可以使用。

回答

0

我不熟悉Java SE打印環境。然而,僅僅看PrintServiceLookup API docs,我不知道爲什麼你正在使用PrintServiceLookup.lookupDefaultPrintService()。這爲您提供了環境首選的PrintService。看起來PrintServiceLookup.lookupPrintServices(DocFlavor flavor, AttributeSet attributes)會讓你指定你喜歡的PrintService。

DocFlavor documentation表示您可以指定MIMEtype「application/postscript」來指示系統爲您提供接受PostScript語言數據的PrintService。

事實上,似乎是一個預定義的DocFlavour.BYTE_ARRAY POSTSCRIPT類,這可能是對你有用的參數。

+0

執行實際打印的第二塊代碼使用默認打印機,我手動將其更改爲要測試的打印機。第一塊代碼是告訴我打印機是否支持Postscript。 – nevets1219 2012-01-18 19:10:38

1

(這是一個註釋太長)

我的最終目標是判斷打印機是否有跋支持或不

如果你想以編程方式確定它那麼以下可能不是很有幫助,但...

我看過文檔,但無法確定是否LaserJet P4014N支持Postscript或不。

當打印機本身講的PostScript和你有打印機的IP不需要驅動程序:你可以簡單地將PostScript文件發送到打印機,打印機會打印。

例如在這裏我的家庭辦公室,我得到了與本地IP 10.0.0.44的PostScript支持HP打印機,我可以簡單地打印.PS文件到打印機做,在命令行:

cat test.ps | netcat 10.0.0.44 9100 

現在我知道它不是你的問題的答案(因此評論太長了評論),但如果你這樣做(或直接從Java發送文件,而不使用任何驅動程序)和打印機打印PostScript文件正確,那麼你可以確定你的打印機確實是在本地講PostScript(這可能會幫助你解決你的Java/PostScript支持問題)。

+0

順便說一句,不要問我爲什麼*貓*然後* netcat *:我這樣做了,因爲它已經成爲一種習慣。 – TacticalCoder 2012-01-18 19:08:58

+0

另請注意,型號並不總是足以確定您是否擁有原生PostScript或不是。舉個例子,你有很多很好的(驚人的)LaserJet 4+,它們已經得到了一個允許它們本地呈現PostScript的模塊,但默認情況下,4+不支持PostScript(與4M +相反):它們全部從一開始就支持PostScript)。 – TacticalCoder 2012-01-18 19:12:19

+0

這似乎是一種更簡單的測試方法,但我需要以編程方式知道打印機是否支持Postscript,因爲我不能指望最終用戶執行相同的操作。 – nevets1219 2012-01-18 19:13:13