在 Java 中打印到特定打印机 (IPP URI)

2022-09-03 06:36:35

在Java中,有没有办法打印到特定的IPP打印机?我发现的所有示例代码和教程都集中在如何使用类似如下内容打印特定类型的文档上:

DocFlavor flavor = DocFlavor.INPUT_STREAM.POSTSCRIPT;
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(MediaSizeName.ISO_A4);
PrintService[] pservices =
             PrintServiceLookup.lookupPrintServices(flavor, aset);
if (pservices.length > 0) {
    DocPrintJob pj = pservices[0].createPrintJob();
    try {
        FileInputStream fis = new FileInputStream("test.ps");
        Doc doc = new SimpleDoc(fis, flavor, null);
        pj.print(doc, aset);
    } catch (FileNotFoundException fe) {
    } catch (PrintException e) { 
    }
}

此代码段只是打印到找到的第一台能够打印文档的打印机。在我的情况下,我想通过URI查找打印机,但似乎不支持这一点。我尝试使用 , 而不是 ,并添加属性,但这不会返回任何打印机。我怀疑查找服务正在寻找可以更改其目标URI的打印机,而不是查找具有该URI的打印机。PrintServiceLookupPrintServiceAttributeSetPrintRequestAttributeSetPrinterURI

作为最后的手段,我想过只枚举返回的所有 s,但 URI 不在任何属性中。打印机名称在那里,但我需要 URI。PrintServicelookupPrintServices

对于后台,我的 Web 应用需要根据当前用户将条形码打印到特定打印机。每个用户都与打印机 URI 相关联,该 URI 指向 CUPS 服务器上的打印机。打印机 URI 是我拥有的唯一信息,我无法将打印机名称限制为与 URI 的 URI 或子字符串匹配。

编辑:为了澄清一点,我不需要渲染数据,我只需要将一个blob复制到给定的打印机。我无法弄清楚的部分是如何通过其IPP URI识别打印机。


答案 1

我终于找到了一种方法来做到这一点,通过使用:jipsi

URI printerURI = new URI("ipp://SERVER:631/printers/PRINTER_NAME");
IppPrintService svc = new IppPrintService(printerURI);
InputStream stream = new BufferedInputStream(new FileInputStream("image.epl"));
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
Doc myDoc = new SimpleDoc(stream, flavor, null);
DocPrintJob job = svc.createPrintJob();
job.print(myDoc, null);

我不得不承认,我不得不使用第三方库来做一些看似简单的事情,比如打印到特定的打印机,这让我感到失望。

更新

DR在评论中指出,jipsi有了一个新的,一个新名字。

Cups4J是一个不错的选择,但顾名思义,如果目标不是CUPS服务器,它可能无法正常工作。我使用 Cups4J 直接打印到 Zebra 热敏打印机取得了不错的效果。


答案 2

我不认为你可以按照自己想要的方式获得打印机(我认为Java打印机制早于IPP)。

但是,如果我没记错的话,您可以在本地渲染打印作业,然后将输出流的字节“手动”传送到目标 CUPS 服务器。这对你来说“足够好”吗?


推荐