当前位置: 首页 > 知识库问答 >
问题:

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

戚修雅
2023-03-14

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

  1. 打印服务器,通过CUPS共享连接的打印机
    (服务器的IP地址为“192.168.1.2”,打印机称为“test_printer”。)

不幸的是,通过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的打印机传播。


    >

    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.add打印机()工作。


    >

  • python模块python escpos/python打印机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
    


    • 不幸的是,2018年似乎没有一个能够实现互联网打印协议(IPP)的python3库

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

  • 共有1个答案

    高兴贤
    2023-03-14

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

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

    >

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

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

    否则,您可以使用netcat IP地址端口号

    因此,如果您想将程序与IPP/CUPS集成,就必须使用一些支持IPP的库

    一种替代方法是让您的程序通过能够这样做的CLI工具执行“IPP与CUPS对话”。

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

    >

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

    它提供了一个ippserver命令行,可以启动一个成熟的,你猜对了,IPP Server暴露你想要的任何功能。

    然后是作为IPP客户端包含的ipptools。您可以运行'ipptools-f myprintfile-t-v ipp://丘比特服务器/打印机/test_printerprint-job.test'将myprintfile发送到“丘比特服务器”上的队列“test_printer”(以示例IPP URI ipp://丘比特服务器/打印机/test_printer给出),并观察它在这样做时将IPP发送到CUPS。

  •  类似资料:
    • 有没有一种方法可以让CUPS在尚未完成最后一个作业的情况下将作业排队到IPP打印机? 背景:我们有一台XEROX Workcenter打印机,它有自己的作业队列。每次有人想要打印时,他们都必须将作业假脱机,将他们的支付卡插入打印机,然后在打印机触摸板上选择他们的作业。但是,当在中央服务器上使用CUPS时,CUPS只在最后一个作业完成时后台处理下一个作业,因此只有第一个后台处理的人才能看到并支付他们

    • 我目前完成的工作: 设置一个带有杯子的树莓圆周率,插入Dymo Labelwriter 450 点击以下链接:设置树莓圆周率。如果我通过家庭网络上的Windows安装网络打印机,这可以在我的本地计算机(Windows)上正常工作并打印 已从成功打印打印作业。NET内核通过。这主要是为了测试。这是当USB标签打印机直接插入我的机器 有一个。从docker容器运行的NET Core(3.1)Web A

    • 问题内容: 我有一部分代码可以作为服务的一部分在本地正常运行。 该代码作为服务的一部分运行,当我通过提供数据进行单元测试时,它最终将生成报告并进行打印。 当我从ajax调用在.ashx中运行完全相同的代码段时。报告已生成(我可以看到在磁盘上创建的pdf文件),但未进行打印。 在这两种情况下,都使用相同的代码来打印报告。(两种情况下objReport.DefaultAutoPrint = 0) 我唯

    • 我正在尝试与CUPS打印服务器通信,该服务器的所有连接都设置了“需要加密”。这意味着,当您尝试建立到它的连接时,它会要求将连接升级到TLS加密的连接,而Cups4j和Jspi似乎都无法处理它。 有没有办法从Java应用程序(使用这些库或其他库)连接到这样的服务器?

    • 问题内容: 我正在使用getifaddrs()和inet_ntop()来获取系统上的ip地址。当系统设置为IPv6时,返回的地址为简化版本(使用::表示零)。有什么办法可以将该地址扩展为完整地址吗? 这是我正在使用的代码: 代码非常感谢。 编辑: 由于这显然很难理解,我举一个例子: 如果我得到abcd:12 :: 3,我需要将其扩展为abcd:0012:0000:0000:0000:0000:00

    • 问题内容: 在我的应用程序中,我有一个包含数据的JTable,我需要添加一个打印按钮,该按钮添加了在打印机纸张上的表中打印数据的功能(发送打印机作业),使用该类怎么可能?我一直在寻找示例,但是找不到一个简单的示例,该示例从JComponent打印一些数据。 这是我发现的网站之一:http : //java.sun.com/products/java- media/2D/forDevelopers/