AFo*_*eee 5 python printing cups network-printers python-3.x
我有两台具有固定 IP 地址的 linux 计算机:
不幸的是,通过 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()
Run Code Online (Sandbox Code Playgroud)
依赖于通过 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", {})
Run Code Online (Sandbox Code Playgroud)
在我可以使用打印机之前,我必须先添加它,这又依赖于通过 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()
Run Code Online (Sandbox Code Playgroud)
可能是最有前途的方法......不幸的是它不打印任何内容并在关闭时抛出异常。
# 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
Run Code Online (Sandbox Code Playgroud)我使用 python 3.6.7。
打印服务器使用 CUPS 2.2.1。
我不是 Python 程序员,无法提供任何示例代码。
但我可以给你一些其他提示:
您的假设“理论上,[....] 只是将格式正确的数据发送到 IP 地址 + 端口”是错误的。
如果您发送某些内容,则必须与 CUPS 服务器“对话 IPP”(是的,通过 IP 地址 + 端口 631)。但仅仅发送文件比谈论 IPP 要少得多。
否则,您可以使用'netcat IPaddress port-no < filename'打印到任何 CUPS 队列(这将是一个巨大的安全问题)。
因此,如果您想将您的程序与 IPP/CUPS 集成,您必须使用一些支持 IPP 的库
一种替代方法是让您的程序通过能够执行此操作的 CLI 工具执行“IPP 与 CUPS 对话”。
查看设计 IPP 的打印机工作组 (PWG) 的ippsample代码。虽然仍处于“测试版”,但已经完全可用。它的所有二进制文件都是命令行 (CLI) 实用程序:
它提供了ippfind辅助工具。如果您在没有任何参数的情况下运行它,它将通过打印各自的 IPP URI 来打印可用 IPP 服务(打印服务器和/或打印机设备)的列表。
它提供了一个ippserver命令行,可以启动一个成熟的(您猜对了)IPP 服务器,公开您想要的任何功能。
然后ipptool作为 IPP 客户端包含在内。您可以运行将“myprintfile”'ipptool -f myprintfile -t -v ipp://cupsserver/printers/test_printer print-job.test'发送到“cupsserver”上的队列“test_printer”(以示例 IPP URI ipp://cupsserver/printers/test_printer给出),并观察它在执行此操作时与 CUPS 进行 IPP 对话。
另 请参阅我的 ASCIIcast“[教程] IPP 示例软件(使用 AppImage 制作)” 。{ https://asciinema.org/a/155588 }。提示:如果播放速度太快,无法及时跟随和理解屏幕,请使用“暂停”按钮,以您自己的速度阅读,然后继续播放。
| 归档时间: |
|
| 查看次数: |
4094 次 |
| 最近记录: |