使用IPP客户端进行打印而无需驱动程序(IPP Client)

9

我有一个设备/电器,无法安装驱动程序。我想通过让用户添加IP地址来支持网络/IPP/AirPrint打印机。

由于我不是通过Windows打印(使用IPP),那么我该如何自己使用IPP呢?是否有c#客户端(或任何Windows库)可以与IPP打印机使用IPP协议进行交互?


我也在研究同样的问题。我已经搞清楚了UPnP打印的基础,但是尝试去研究IPP/AirPrint时进展不大。如果你有任何进展,请更新你的帖子。 - earthling
好的。网上真的没有什么信息。苹果对打印机/设备之间实际网络合同非常保密。我在IPP方面找不到任何信息。我在某个地方读到AirPrint是IPP的扩展,所以如果我们能够弄清楚IPP,那么我们就应该没问题了。 - Paul Knopf
如果你发现了什么,请告诉我。 - Paul Knopf
你有找到这方面的任何资料吗? - user319862
2个回答

9
有一些可用于不同编程语言(Java/PHP/Python)的IPP客户端实现和IPP库。一个实用的解决方案可能是使用https://openprinting.github.io/cups/上提供的ipptool。创建一个名为printjob.ippipp-command-file
{
 OPERATION Print-Job
 GROUP operation-attributes-tag
  ATTR charset attributes-charset utf-8
  ATTR language attributes-natural-language en
  ATTR uri printer-uri $uri
 FILE $filename
}

现在你应该可以使用这些选项打印PDF文件了:
ipptool -tv -f mydoc.pdf ipp://192.168.2.207 printjob.ipp

确保打印机(或打印服务器)支持您发送的文档格式。我假设您熟悉如何在应用程序中执行外部命令。
尽管ipptool是由CUPS提供的,但它可以与任何IPP打印机完美配合使用。请查看RFC 3510或您的打印机文档以获取适当的打印机URI方案,或者使用ippfind
有经验的开发人员应该能够使用他们喜欢的编程语言和生态系统来实现打印作业操作。我已经使用Kotlin实现了上述用例,只需100行代码:https://github.com/gmuth/ipp-printjob-kotlin
这是我在Java中的最简PrintJob实现:https://github.com/gmuth/ipp-printjob-java

1
打印机不需要“支持您发送的文档格式”!它是CUPS需要支持文档格式。(您的命令行表明您正在通过CUPS服务器打印,而不是直接连接到IPP打印机--否则为什么要使用“ipp://localhost/printers/laser”作为URI?) CUPS将自动对您发送的文件进行类型识别,并自动创建适当的文件格式过滤链以生成打印机所需的作业文件类型。您可以使用ipptool发送PDF文件,目标打印机可以是PCL设备。CUPS将处理所需的翻译... - Kurt Pfeifle
1
Paul的原始问题与CUPS无关。确实,一些(更好的)打印机或打印服务器使用application/octet-stream作为默认文档格式,因此需要自动键入接收到的数据。没有驱动程序的打印最适合使用PDF和接受PDF的打印机(例如LaserJet M175nw或imagePRESS C7010VP)。使用CUPS不能被视为没有驱动程序的打印,因为CUPS本身始终需要“驱动程序”或过滤器。询问IPP或“无驱动程序打印”的人往往会避免像CUPS这样的中间件。 - IPP Nerd
"Paul的问题与CUPS无关。" 这是事实。-- 然而,你的回答假设作业通过CUPS进行。你使用的IPP URI方案不匹配我所知道的任何 IPP打印设备的URI(我知道的超过一百个)。但它与CUPS使用的相匹配。 - Kurt Pfeifle
4
如果您想使用IPP URI直接寻址打印设备,那么请使用以下其中一种:*ipp://printername-or-ip/*,或者 ipp://printername-or-ip/ipp,或者 *ipp://printername-or-ip/printer/*,或者 ipp://printername-or-ip/ipp/port1,或者 ipp://printername-or-ip/ipp/print。这些涵盖了约95%的真实IPP设备。不幸的是,这并没有真正标准化。(我测试过的设备中没有一个支持ipp://printername-or-ip/printers/queuename)。 - Kurt Pfeifle
你认为CUPS在所有细节上都实现了IPP 1:1,这种假设是错误的。此外,如果规范中说“应该”,不要假设CUPS没有执行它。-- 我不明白你认为我的哪些陈述是“错误的”... - Kurt Pfeifle
显示剩余4条评论

2

IPP示例软件

同时IPP示例软件(包括上面提到的ipptool)是Github上的一个独立项目。它现在由打印机工作组(PWG)管理,该组织标准化了IPP(Internet Printing Protocol)。

虽然该软件目前仍处于测试版,但已经非常实用。它提供两个主要的命令行工具:

  1. ippserver. 启动它(使用适当的选项),您将在网络上拥有一个完整的IPP服务器实例,作为虚拟IPP打印机(或托管多个虚拟IPP队列的IPP服务器),您可以使用它来测试任何(或您自己编写的)IPP客户端软件。

  2. ipptool. 这是一个IPP客户端程序,可以向网络上的任何IPP实例(CUPS服务器、ippserver、支持IPP的打印机硬件)发送任意组合的IPP请求并验证其响应。该软件附带了一些准备好的文本文件,其中包含示例IPP请求,所有这些文件名都带有.test后缀。

为了您的目的,您可以运行以下命令:

  1. ipptool -t -v ipp://xxx.xxx.xxx.xxx/ipp/print get-printer-attributes.test。 此命令将查询任何IPP打印机的支持的IPP属性,其中应包括一个项目,告知其所谓的IPP版本支持情况。例如,报告为ipp-versions-supported (1setOf keyword) = 1.0,1.1,2.0

  2. ipptool -t -v ipp://xxx.xxx.xxx.xxx/ipp/print ipp-1.1.test。 此命令将对打印机运行完整的验证套件,以测试其真实的IPP-1.1兼容性。

  3. ipptool -t -v ipp://xxx.xxx.xxx.xxx/ipp/print ipp-2.0.test。 此命令将对打印机运行完整的验证套件,以测试其真实的IPP-2.0兼容性。

  4. ipptool -t -v ipp://xxx.xxx.xxx.xxx/ipp/print ipp-2.0.test。 此命令将对打印机运行完整的验证套件,以测试其真实的IPP-2.0兼容性。

  5. ipptool -t -v ipp://xxx.xxx.xxx.xxx/ipp/print ipp-2.1.test。 此命令将对打印机运行完整的验证套件,以测试其真实的IPP-2.2兼容性。

  6. ipptool -t -v ipp://xxx.xxx.xxx.xxx/ipp/print ipp-2.2.test。 此命令将对打印机运行完整的验证套件,以测试其真实的IPP-2.2兼容性。

  7. ipptool -t -v ipp://xxx.xxx.xxx.xxx/ipp/print ipp-everywhere.test。 此命令将对打印机运行完整的IPP Everywhere(即最新的IPP标准)验证套件,以测试其真实的IPP Everywhere兼容性。


IPP示例软件的AppImage

为了让大家进行这种类型的测试变得更加容易,我创建了一个现成的可执行AppImage,其中包含了IPP示例软件,可以在所有x86_64 Linux发行版上直接运行(无需“安装”)。

你可以在几乎任何Linux系统上使用它,而无需安装CUPS或ippsample!

AppImage已经嵌入了IPP示例软件项目的所有主要可执行命令行工具。这些可执行文件将作为AppImage的“子命令”运行。请参见下面的示例。

  1. Download:

    wget https://github.com/KurtPfeifle/ippsample/releases/download/continuous/ippsample-x86_64.AppImage
    
  2. Make AppImage executable (and optionally rename it to ippsample):

    chmod a+x ippsample-x86_64.AppImage
    mv ippsample-x86_64.AppImage ippsample
    
  3. Have a look at its built-in help screen:

    ./ippsample --ai-usage
    
  4. Run it:

    ./ippsample ipptool -t -v ipp://xxx.xxx.xxx.xxx/ipp/print ipp-2.0.test
    
  5. Find all IPP-capable printers nearby:

    ./ippsample ippfind
    

    will yield s.th. like:

    ipp://HPA0B3CCF051B9.local:631/ipp/printer
    ipp://lenjessie2.local:8444/ipp/print
    ipp://mbp14.papercut-ipv4.local:631/printers/OJ6500
    ipp://mbp14.papercut-ipv4.local:631/printers/libreoffice-pin-code-drucker
    
  6. Pick one printer, print a job:

    ./ippsample ipptool       \
            -tv               \
            -f ./printjob.pdf \
             ipp://HPA0B3CCF051B9.local:631/ipp/printer \
             print-job.test
    

ASCIinema ASCIIcast

这里是一个(较旧的)ASCIinema ASCII演示,作为我所写内容的说明以及如何使用IPP样品软件(及其AppImage)的示例:

asciicast


@IPPGeek:现在可以了,现在连极客们也能够复制它。 - Kurt Pfeifle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接