【问题标题】:Determining Postscript printing support确定 Postscript 打印支持
【发布时间】:2012-02-13 11:32:24
【问题描述】:

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

【问题讨论】:

    标签: java printing postscript printers thermal-printer


    【解决方案1】:

    (评论太长了)

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

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

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

    当打印机本身使用 PostScript 并且您已获得打印机的 IP 时,您不需要驱动程序:您只需将 PostScript 文件发送到打印机,打印机就会打印它。

    例如,在我的家庭办公室,我有一台 HP 打印机,在本地 IP 10.0.0.44 上支持 PostScript,我可以通过以下命令简单地将 .ps 文件打印到该打印机行:

    cat test.ps | netcat 10.0.0.44  9100
    

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

    【讨论】:

    • 顺便说一句,不要问我为什么要cat然后netcat:我已经这样做很久了,这已经成为一种习惯.
    • 另请注意,型号并不总是足以确定您是否拥有本机 PostScript。举个例子,你有很多旧的(惊人的)LaserJet 4+,它们已经收到一个模块,允许它们本地渲染 PostScript,尽管默认情况下,4+ 不支持 PostScript(与 4M+ 相反:它们都是从一开始就支持 PostScript)。
    • 这似乎是一种更简单的测试方法,但我确实需要以编程方式了解打印机是否支持 Postscript,因为我不能指望最终用户做同样的事情。
    • @nevets129:是的,我猜是这样,这就是为什么我提到它不是答案:(至少它可以帮助您确定您提到的打印机是否具有本机 PostScript 支持: )
    【解决方案2】:

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

    DocFlavor documentation 表示您可以指定 MIMEtype 为“application/postscript”以指示系统为您提供接受 PostScript 语言数据的 PrintService。

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

    【讨论】:

    • 执行实际打印的第二个代码块使用默认打印机,我手动将其更改为我正在测试的任何打印机。第一段代码告诉我打印机是否支持 Postscript。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    相关资源
    最近更新 更多