【问题标题】:Use IPP(Internet Printing Protocol) or LPR(Line printer Remote) to print file in android使用 IPP(互联网打印协议)或 LPR(远程行打印机)在 android 中打印文件
【发布时间】:2015-07-18 21:47:29
【问题描述】:

我的要求是在不使用任何基于云的服务的情况下从安卓设备打印文件。

我已经能够使用 “原始”打印协议来实现它,即只需将文件发送到端口 9100 的打印机 IP 地址。这是代码sn-p:

 client = new Socket(ip,port); //Port is 9100
 byte[] mybytearray = new byte[(int) file.length()]; //create a byte array to file
 fileInputStream = new FileInputStream(file);
 bufferedInputStream = new BufferedInputStream(fileInputStream);
 bufferedInputStream.read(mybytearray, 0, mybytearray.length); //read the file
 outputStream = client.getOutputStream();
 outputStream.write(mybytearray, 0, mybytearray.length); //write file to the output stream byte by byte
 outputStream.flush();
 bufferedInputStream.close();
 outputStream.close();

“原始”打印协议的问题在于无法从打印机获取状态。

所以,我最近阅读了有关 IPPLDR 的信息,我们可以使用它们从打印机中获取状态。

我试图找到一种使用 android 实现它们的方法,但没有成功。我已经通过this answer,但没有成功找到我的解决方案。

如果有人能指导我如何在 android 中实现 IPP 或 LDR,那将非常有帮助。

提前致谢!

【问题讨论】:

  • 你想读什么样的状态? IPP 提供与 IPP 通信本身相关的通用响应状态。您可以从打印机对象或作业对象中读取属性。您可以检查作业是否已正常提交,甚至等到作业状态“完成”(=已打印)。
  • 基本上我只想确认提交的作业是否已完成,即打印机是否打印了文件。在我上面提到的当前场景中,我无法获得任何类似的状态
  • @Exception 我正在尝试使用您的代码打印 pdf 文件,但它只打印字节码而不是实际的文件数据,请您在这里帮助我
  • 你能告诉我这适用于什么打印机吗?我使用的是廉价的 HP 型号,它只能打印 ANSI 字符。

标签: android printing ipp-protocol


【解决方案1】:

IPP的一般用法:

  1. 提交打印作业后,打印机会返回作业 ID
  2. 使用 Get-Job-Attributes-Operation 来获取当前的作业状态
  3. 等到属性 job-state 等于 9(表示“已完成”)

还有其他你应该检查的最终工作状态:中止或取消

对于原型设计,您可以使用 ipptool(原生用于桌面):

# ipptool -t -d job=482 ipp://192.168.2.113/ipp job.ipp
{
OPERATION Get-Job-Attributes
GROUP operation-attributes-tag
  ATTR charset attributes-charset utf-8
  ATTR language attributes-natural-language en
  ATTR uri printer-uri $uri
  ATTR integer job-id $job
}

2020 年 5 月更新

我已经发布了 ipp 协议的 kotlin 实现。

https://github.com/gmuth/ipp-client-kotlin

提交后,您可以等待打印作业终止:job.waitForTermination()

【讨论】:

  • 我还是不明白如何在android上实现它,我不想使用Android-PrintService,因为我不认为它使用IPP或LPR
  • 有许多声称支持 IPP 的 android 打印服务应用程序 - 不涉及云处理。不幸的是,它们似乎效果不佳。您可以很好地绕过官方的 android print api 并直接连接到打印机。缺点是你必须自己实现 IPP。
  • @IPPNerd 如何在安卓应用中使用ipp?你有演示样品吗?
  • 我在这里提供了如何使用该库的示例:github.com/gmuth/ipp-samples
猜你喜欢
  • 2016-01-07
  • 2022-01-14
  • 2012-01-24
  • 2016-08-16
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 1970-01-01
相关资源
最近更新 更多