首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Java打印到特定打印机(IPP URI)

用Java打印到特定打印机(IPP URI)
EN

Stack Overflow用户
提问于 2009-10-31 19:11:44
回答 4查看 25.3K关注 0票数 16

Java中有任何方法可以打印到特定的IPP打印机吗?我发现的所有示例代码和教程都集中于如何使用以下内容打印特定类型的文档:

代码语言:javascript
运行
复制
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来识别打印机。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-11-02 18:24:41

通过使用jipsi,我终于找到了一种方法来做到这一点

代码语言:javascript
运行
复制
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);

我不得不承认,我不得不使用第三方库来做一些看似简单的事情,比如打印到特定的打印机上,这让我很失望。

更新

博士在评论中指出,jipsi有一个新的首页和一个新的名称。

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

票数 18
EN

Stack Overflow用户

发布于 2009-10-31 19:24:57

我认为您无法以您想要的方式获得打印机(我认为Java打印机制早于IPP)。

但是,如果我记得正确地在本地呈现您的打印作业,然后将输出流的字节“手动”传送到目标CUPS服务器,您可能会这样做。这对你来说“够好了”吗?

票数 1
EN

Stack Overflow用户

发布于 2020-03-19 14:20:16

仅通过IPP将可打印的文档格式(如PDF )提交给打印机(或CUPS),这段代码提供了一个不依赖项的极简实现。ipp-printjob-java具有解码ipp响应的基本支持。

代码语言:javascript
运行
复制
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));
  }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1655297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档