我一直在尝试确定打印机是否能够打印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.POSTSCRIPT
或DocFlavor.BYTE_ARRAY.POSTSCRIPT
,它会返回Win32 Printer : HP LaserJet 2300L PS
和Win32 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 );
它可以在支持Postscript的打印机以及Java上没有Postscript支持的网络打印机(HP LaserJet P4014N)上正确打印。在我的收据打印机上,它会打印Postscript文件,就好像它只是文本一样。有人向我建议,网络打印机没有正确响应Java(通用驱动程序等),并且它实际上可以支持Postscript。我查看了文档,但无法确定LaserJet P4014N是否支持Postscript。我找到了另一台打印机(HP Laserjet 2055dn)并通过USB连接到我的计算机,Java仍然报告它不支持Postscript,尽管能够使用上述方法打印它。
也许我做错了什么?如果没有,我如何正确检测打印机是否支持Postscript?我的最终目标是确定打印机是否具有Postscript支持,如果它没有将Postscript转换为JPG(分辨率损失,但源确实有图像)并打印出来。如果您有任何关于将Postscript文件打印到非Postscript打印机的建议,我很乐意听到它!如果您需要更多信息,请与我们联系。
我找到了一些可以使用的示例Postscript文件here。
答案 0 :(得分:2)
(这对评论来说太长了)
我的最终目标是确定打印机是否具有Postscript支持
如果您想以编程方式确定它,那么以下内容可能没什么帮助,但是......
我查看了文档,但无法确定是否是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支持问题)。
答案 1 :(得分:0)
我不熟悉Java SE打印环境。但是,只看PrintServiceLookup API docs,我想知道你为什么要使用PrintServiceLookup.lookupDefaultPrintService()
。这为您提供了环境所喜欢的PrintService。似乎PrintServiceLookup.lookupPrintServices(DocFlavor flavor, AttributeSet attributes)
会让您指定您喜欢的PrintService。
DocFlavor documentation表示您可以指定MIME类型“application/postscript
”,以指示系统为您提供接受PostScript语言数据的PrintService。
事实上,似乎有一个预定义的DocFlavour.BYTE_ARRAY POSTSCRIPT
类可能对您有用。