python - 我可以将打印作业直接从 python 程序发送到 CUPS 打印服务器的 IP 地址吗?

标签 python python-3.x printing cups network-printers

我有两台具有固定 IP 地址的 linux 计算机:

  1. 打印服务器,通过CUPS 共享连接的打印机.
    (服务器的 IP 地址为“192.168.1.2”,打印机名为“test_printer”。)
  2. 运行 python 应用程序的计算机应该能够使用此打印服务器。

不幸的是,通过 CUPS 的打印机传播似乎无法可靠地工作(可能是由于网络结构)。

我可以直接从 python 程序发送打印作业到 CUPS 打印服务器吗?
如果是这样,您能否提供一个小示例?

理论上,我会向 IP 地址 + 端口发送正确格式的数据,但我没有让它工作......


以下是我目前发现的方法以及我遇到的问题:

  • 命令'lpr'

    import subprocess
    
    lpr = subprocess.Popen("usr/bin/lpr", stdin=subprocess.PIPE)        # on some distros the command is 'lp'
    lpr.stdin.write("hello world\n")
    lpr.stdin.close()
    

    依赖于通过 CUPS 的打印机传播。


  • python 模块 pycups

    import cups
    
    with open("/home/user/Documents/some.txt", "w") as f:
        f.write("hello world\n")
    
    conn = cups.Connection()
    conn.printFile("test_printer", "/home/user/Documents/some.txt", "some_title", {})
    

    在我可以使用打印机之前,我必须先添加它,这又依赖于通过 CUPS 的传播。
    我也没有得到 conn.addPrinter()去工作。


  • python 模块 python-escpos/python-printer-escpos

    import escpos.printer
    
    p = escpos.printer.Network("192.168.1.2", port=631)        # port 9100 seems not to work.
    p.text("hello world\n")
    p.close()
    

    可能是最有前途的方法......不幸的是它不打印任何东西并在关闭时抛出异常。

    # The traceback was produced in the interactive shell.
    Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
        File "/home/user/.local/lib/python3.6/site-package/escpos/printer.py", line 214, in close
            self.device.shutdown(socket.SHUT_RDWR)
    OSError: [Errno 107] Transport endpoint is not connected
    



我使用的是 python 3.6.7。
打印服务器使用 CUPS 2.2.1。

最佳答案

我不是 Python 程序员,无法提供任何示例代码。

但我可以给你一些其他提示:

  1. 您的假设“理论上,[....] 只需将格式正确的数据发送到 IP 地址 + 端口” 是错误的。

    如果你发送一些东西,你必须与 CUPS 服务器“对话 IPP”(是的,通过 IP 地址 + 端口 631)。但是仅仅发送一个文件比谈论 IPP 要少得多。

    否则,您可以使用 'netcat IPaddress port-no < filename' 打印到任何 CUPS 队列(这将是一个巨大的安全问题)。

    所以如果你想将你的程序与 IPP/CUPS 集成,你必须使用一些支持 IPP 的库

  2. 一种替代方法是让您的程序通过能够执行此操作的 CLI 工具执行“IPP 与 CUPS 对话”。

    看看 ippsample code设计 IPP 的打印机工作组 (PWG) 的成员。那仍然处于“测试版”,但已经完全可用。它的所有二进制文件都是命令行 (CLI) 实用程序:

    • 它提供了 ippfind辅助工具。如果您在没有任何参数的情况下运行它,它将通过打印它们各自的 IPP URI 来打印可用 IPP 服务(打印服务器和/或打印机设备)的列表。

    • 它提供了一个 ippserver命令行,它可以启动一个成熟的 IPP 服务器,您猜对了,它可以公开您想要的任何功能。

    • 然后是ipptool作为 IPP 客户端包括在内。您可以运行 'ipptool -f myprintfile -t -v ipp://cupsserver/printers/test_printer print-job.test' “myprintfile” 发送到 “cupsserver” 上的队列 “test_printer”(给出示例 IPP URI ipp ://cupsserver/printers/test_printer)并观察它在这样做时将 IPP 与 CUPS 通信。

另请参阅我的 ASCIIcast“[TUTORIAL] IPP 示例软件(使用 AppImage 制作)”here . { https://asciinema.org/a/155588 }. 提示:如果播放速度太快无法及时跟上和理解屏幕,请使用“暂停”按钮,以您自己的速度阅读,然后继续播放。

关于python - 我可以将打印作业直接从 python 程序发送到 CUPS 打印服务器的 IP 地址吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53638793/

相关文章:

python - 无法从用 Python C API 构建的模块中调用方法

python-3.x - pip install tabulate UnicodeDecodeError 错误

具有来自另一个模型的默认值的 Django 模型字段

windows - Microsoft Web 浏览器 ActiveX 控件 - 打印到指定(非默认)打印机

python - 无法从 JSON 对象在 Python 中打印字符 '\u2019'

python - 为什么我的不同实例变量在 python 中链接在一起

python - 你如何在 Tkinter 的事件循环中运行你自己的代码?

python - Azure key 保管库 : Merge certificate

python - 编写 if 语句以避免某些列表项的更好方法是什么?

java - 代码不产生 java 输出