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
返回的所有lookupPrintServices
,但是URI不在任何属性中。打印机名称在那里,但我需要URI。
作为背景,我的webapp需要根据当前用户将条形码打印到特定的打印机。每个用户都与打印机URI相关联,该URI指向CUPS服务器上的打印机。打印机URI是我拥有的唯一信息,我不能限制打印机名称来匹配URI或URI的子字符串。
编辑:为了澄清一点,我不需要渲染数据,我只需要将blob复制到给定的打印机。我无法理解的部分是如何通过它的IPP URI来识别打印机。
发布于 2009-11-02 18:24:41
通过使用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直接打印到斑马热打印机。
发布于 2009-10-31 19:24:57
我认为您无法以您想要的方式获得打印机(我认为Java打印机制早于IPP)。
但是,如果我记得正确地在本地呈现您的打印作业,然后将输出流的字节“手动”传送到目标CUPS服务器,您可能会这样做。这对你来说“够好了”吗?
发布于 2020-03-19 14:20:16
仅通过IPP将可打印的文档格式(如PDF )提交给打印机(或CUPS),这段代码提供了一个不依赖项的极简实现。ipp-printjob-java具有解码ipp响应的基本支持。
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URI;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
public class IppPrintJob {
public static void main(String args[]) throws Exception {
URI printerURI = URI.create("http://colorjet:631/ipp/printer");
File file = new File("A4-blank.pdf");
short status = new IppPrintJob()
.printDocument(printerURI, new FileInputStream(file));
System.out.println(String.format("ipp status: %04X", status));
}
short printDocument(
URI uri, InputStream documentInputStream
) throws IOException {
HttpURLConnection httpURLConnection =
(HttpURLConnection) uri.toURL().openConnection();
httpURLConnection.setDoOutput(true);
httpURLConnection.setRequestProperty("Content-Type", "application/ipp");
OutputStream outputStream = httpURLConnection.getOutputStream();
DataOutputStream dataOutputStream =
new DataOutputStream(httpURLConnection.getOutputStream());
dataOutputStream.writeShort(0x0101); // ipp version
dataOutputStream.writeShort(0x0002); // print job operation
dataOutputStream.writeInt(0x002A); // request id
dataOutputStream.writeByte(0x01); // operation group tag
writeAttribute(dataOutputStream, 0x47, "attributes-charset", "utf-8");
writeAttribute(dataOutputStream, 0x48, "attributes-natural-language", "en");
writeAttribute(dataOutputStream, 0x45, "printer-uri", uri.toString());
dataOutputStream.writeByte(0x03); // end tag
documentInputStream.transferTo(outputStream);
dataOutputStream.close();
outputStream.close();
if (httpURLConnection.getResponseCode() == 200) {
DataInputStream dataInputStream =
new DataInputStream(httpURLConnection.getInputStream());
System.out.println(String.format("ipp version %d.%s",
dataInputStream.readByte(), dataInputStream.readByte()
));
return dataInputStream.readShort();
} else {
throw new IOException(String.format("post to %s failed with http status %d",
uri, httpURLConnection.getResponseCode()
));
}
}
void writeAttribute(
DataOutputStream dataOutputStream, int tag, String name, String value
) throws IOException
{
Charset charset = StandardCharsets.UTF_8;
dataOutputStream.writeByte(tag);
dataOutputStream.writeShort(name.length());
dataOutputStream.write(name.getBytes(charset));
dataOutputStream.writeShort(value.length());
dataOutputStream.write(value.getBytes(charset));
}
}
https://stackoverflow.com/questions/1655297
复制相似问题