打印在Java中特定的打印机(IPP URI)
-
11-09-2019 - |
题
有没有在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
返回lookupPrintServices
s的枚举,但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);
我必须承认我很失望,在不必使用第三方库做一些这样看似为打印到特定的打印机简单。
<强>更新强>
Cups4J 是一个很好的选择,但是顾名思义如果目的地是它可能无法正常工作不是CUPS服务器。我已用Cups4J直接打印到斑马热敏打印机有良好的效果。
其他提示
我不认为你可以得到一台打印机,你想的方式(我认为Java的打印机制早IPP)。
您可能,但是,如果我没有记错能够“手”本地呈现您的打印作业,然后运往输出流的目标CUPS服务器的字节数。这将是“足够好”的吗?