打印在Java中特定的打印机(IPP URI)(Print to specific printer

2019-09-03 05:26发布

有没有在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 S按返回lookupPrintServices ,但URI是没有任何属性。 打印机名称是存在的,但我需要的URI。

有关背景,我的web应用程序需要打印条形码到一个特定的打印机,基于当前用户。 每个用户都与一个打印机URI,它指向一个CUPS服务器上的打印机相关联。 打印机URI是我唯一的信息,我不能约束打印机名称相匹配的URI或URI的子。

编辑:要澄清一点,我并不需要渲染的数据,我只需要一个blob复制到指定的打印机。 我想不通的部分是如何识别它的IPP URI的打印机。

Answer 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);

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

UPDATE

DR在指出评论认为jipsi有一个新的家庭 ,和一个新的名字。

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



Answer 2:

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

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



文章来源: Print to specific printer (IPP URI) in Java