我一直在尝试确定打印机是否能够打印 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 文件。