2012-01-18 69 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