linux 直接打印到未安装的网络打印机

linux print directly to network printer that IS NOT installed

我需要构建一个简单的基于 Web 的打印机服务器,它将文件打印到任何给定的打印机 IP 地址

如何使用 lp 或 lpr 通过 IP 地址直接将文件打印到网络打印机?注意:打印机不会在本地 CUPS 中设置,因为它需要能够打印到抛给它的任何 IP 地址。

我尝试过的:

lp -d 10.11.234.75 /path/to/file
lpr -P 10.11.234.75 /path/to/file

两者都给出:'The printer or class does not exist.'

你想做的事很可能不可行。如果这些 IP 地址末尾的打印机只是随机打印机,那么您正在构建的服务器将需要知道要使用哪个驱动程序才能向它们打印。如果您事先没有以任何方式安装它们,那么它是行不通的。

如果您只想与其他 Internet 打印协议 (IPP) 服务器通信,则可以,尽管不一定优雅。除了 CUPS,我不知道还有其他 Linux IPP 客户端实现,而且 CUPS 要求您提前安装打印机。不过,这可以很容易地完成(如 here 所解释的)。添加普通打印机(但您需要知道要使用哪个驱动程序)的代码与添加 IPP 服务器的代码相同。或者,您可以找到另一个不需要安装打印机的 IPP 实现(或编写一个 - 发送文档应该相当简单)。

这是将 IPP 打印机添加到 CUPS 的代码:

lpadmin -E -p <printer-name> -v http://<ip_address>:631/<dir>/<printer> -L <location> -E

<printer-name><location> 可以是任何你喜欢的,你需要打印机的完整网络路径。

要添加普通打印机:

lpadmin -E -p <printer-name> -v <device-uri> -m <model> -L <location> -E

这个也是一样的,只是需要给一个<model>,就是打印机的驱动。如果您不想加密,请取消第一个 -E

如果以后要删除打印机,请使用:

lpadmin -x <printer-name>

试试这个:

cat you_file.prn | netcat -w 1 printer_ip 9100

我找到了一个名为 tcpsend.c 的旧程序,用于将文件发送到 IP 地址上的打印机。使用 gcc -o tcpsend tcpsend.c

构建
$ ./tcpsend
use: tcpsend [-t timeout] host port [files]
  -t timeout  - try connecting for timeout seconds

tcpsend.c source code

如果使用 bash 那么:

cat /path/to/file > /dev/tcp/10.11.234.75/9100

我成功使用 lp 主机名和端口。

echo foobar | lp -h 10.10.13.37:9100 -

如果不指定端口,我会得到

lp: Error - No default destination


如果打印 PDF,您可以先使用 pdf2ps

将其转换为 PostScript
pdf2ps file.pdf - | lp -h 10.10.13.37:9100 -

参数 - 用作标准输入或输出的别名,让我们将 postscript 的输出直接输送到 lp 的标准输入。