确定Postscript打印支持

时间:2012-01-18 18:28:40

标签: java printing postscript printers thermal-printer

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

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

2 个答案:

答案 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类可能对您有用。