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

标签 java printing ipp-protocol

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 查找打印机,但 PrintServiceLookup 似乎不支持此功能。我试过使用 PrintServiceAttributeSet,而不是 PrintRequestAttributeSet,并添加了 PrinterURI 属性,但这不会返回任何打印机。我怀疑查找服务正在寻找可以更改其目标 URI 的打印机,而不是寻找具有该 URI 的打印机。

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

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

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

最佳答案

我终于找到了一种方法,使用 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);

我不得不承认,我对必须使用第 3 方库来执行打印到特定打印机这样看似简单的事情感到失望。

更新

DR 在 comments 中指出jipsi 有一个新的 home , 和一个新名字。

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

关于java - 在 Java 中打印到特定打印机 (IPP URI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1655297/

相关文章:

java - 纹理渲染不正确(OpenGL)

java - MySQLNonTransientConnectionException : Data source rejected establishment of connection, 来自服务器的消息: "Too many connections"

java - 使用处理存储从串行连接读取的 Arduino 数据

list - Elixir:打印列表以及字符串

binaryfiles - 如何剖析 CUPS 作业控制文件 '/var/spool/cups/cNNNNNN' ?

java - 从 BungeeCord 发送 PluginMessage 到 SpigotServer

python - 用 Python 实现的弗洛伊德算法。二维打印阵列

python - Python中字符串的条件显示

使用无需驱动程序的 IPP 进行打印(IPP 客户端)