确定Postscript打印支持

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)。安装“HP通用打印驱动程序Windows PostScript”后,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连接到我的计算机,并且用上述方法仍然无法支持Postscript。
也许我做错了什么?如果没有,如何正确检测打印机是否支持Postscript?我的最终目标是确定打印机是否具有Postscript支持,如果没有,则将Postscript转换为JPG(分辨率损失,但源代码确实包含图像)并打印。如果您对将Postscript文件打印到不支持Postscript的打印机上有任何建议,我很想听听!请让我知道是否需要其他信息。
我在此处找到了一些示例Postscript文件(链接),您可以使用它们。
2个回答

2

(这段文字太长了,不适合作为评论)

我的最终目标是确定打印机是否支持Postscript

如果您想以编程方式确定它,则以下内容可能没有太大帮助,但是......

我查看了文档,但无法确定LaserJet P4014N是否支持Postscript。

当打印机本地支持PostScript并且您拥有打印机的IP时,您无需驱动程序:您可以直接将PostScript文件发送到打印机,然后打印机将打印它。

例如,在我的家庭办公室中,我有一台支持PostScript的HP打印机,其本地IP为10.0.0.44,我可以通过以下方式将.ps文件打印到该打印机:

cat test.ps | netcat 10.0.0.44  9100

现在我知道这不是你问题的答案(因此评论太长),但如果你这样做(或直接从Java发送文件,而不使用任何驱动程序),并且打印机正确打印PostScript文件,则可以确定您的打印机确实原生支持PostScript(这可能有助于您解决Java / PostScript支持问题)。


顺便说一句,不要问我为什么要用 cat 然后再用 netcat:我已经这样做很久了,已经成为了一种习惯。 - TacticalCoder
请注意,型号并不总是足以确定您是否具有本机PostScript。 例如,您有很多优秀的老式(惊人的)LaserJet 4+,它们已经接收了一个模块,使它们能够本地呈现PostScript,尽管默认情况下,4+不支持PostScript(与4M +相反:它们从一开始就支持PostScript)。 - TacticalCoder
这似乎是一种更简单的测试方式,但我需要编程知道打印机是否支持Postscript,因为我不能指望最终用户做同样的事情。 - nevets1219
@nevets129:是的,我猜到了,这就是为什么我提到它不是一个答案的原因 :( 至少它可以帮助你确定你提到的打印机是否具有本地PostScript支持 :) - TacticalCoder

0

我不熟悉Java SE打印环境。然而,仅仅看一下PrintServiceLookup API文档,我想知道为什么你在使用PrintServiceLookup.lookupDefaultPrintService()。这会给你环境首选的PrintService。似乎PrintServiceLookup.lookupPrintServices(DocFlavor flavor, AttributeSet attributes)可以让你指定你喜欢的PrintService。

DocFlavor文档说你可以指定一个MIME类型为“application/postscript”,以便将系统定向到接受PostScript语言数据的PrintService。

实际上,似乎有一个预定义的DocFlavour.BYTE_ARRAY POSTSCRIPT类,可能是你有用的参数。


实际打印的第二个代码块使用默认打印机,我手动更改为我正在测试的任何打印机。第一个代码块告诉我打印机是否支持Postscript。 - nevets1219

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接