有没有在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的打印机的打印机。

作为最后的手段,我想到了刚刚经历所有PrintService返回lookupPrintServicess的枚举,但URI是没有任何属性。打印机名称是存在的,但我需要的URI。

有关的背景,我的web应用需要打印的条形码,以特定的打印机,基于所述当前用户。每个用户都与一个打印机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);

我必须承认我很失望,在不必使用第三方库做一些这样看似为打印到特定的打印机简单。

<强>更新

DR指出在评论该jipsi具有新的和一个新的名字。

Cups4J 是一个很好的选择,但是顾名思义如果目的地是它可能无法正常工作不是CUPS服务器。我已用Cups4J直接打印到斑马热敏打印机有良好的效果。

其他提示

我不认为你可以得到一台打印机,你想的方式(我认为Java的打印机制早IPP)。

您可能,但是,如果我没有记错能够“手”本地呈现您的打印作业,然后运往输出流的目标CUPS服务器的字节数。这将是“足够好”的吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top