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.POSTSCRIPT或者DocFlavor.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 );

它可以在支持 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 文件。

4

2 回答 2

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 支持问题)。

于 2012-01-18T19:08:30.260 回答
0

我不熟悉 Java SE 打印环境。但是,仅查看PrintServiceLookup API 文档,我就想知道您为什么要使用PrintServiceLookup.lookupDefaultPrintService(). 这为您提供了环境喜欢的 PrintService。似乎PrintServiceLookup.lookupPrintServices(DocFlavor flavor, AttributeSet attributes)可以让您指定您喜欢的 PrintService。

DocFlavor 文档说您可以指定 MIMEtype 为 " "application/postscript以指示系统为您提供接受 PostScript 语言数据的 PrintService。

事实上,似乎有一个预定义的DocFlavour.BYTE_ARRAY POSTSCRIPT类对您来说可能是一个有用的参数。

于 2012-01-18T18:48:56.210 回答