命令行打印指南

2021-08-10, 星期二, 22:25

事情的起因是读了这篇 Bye CUPS: Printing with Netcat,因此打算对几种常见的打印方法做个收集。

最简单的方法

网络打印机支持多种协议,其中套接字协议一般使用 9100 端口。

套接字 是指将纯文本打印数据直接发送到 TCP 套接字的连接。一些常用的套接字端口号包括 910035。设备 URI(统一资源标识符)的语法为 socket://打印机 IP:端口,例如 socket://192.168.2.202:9100/

# 一个简易的 Python 例子
client_socket = socket.create_connection(('my.laser.local', 9100))
client_socket.send(fileInBytes)
client_socket.close()

大多数系统都携带了 netcat 工具,可以用来发送文件。

# 英文字符的纯文本文件和 PostScript/PDF 文件应该是直接支持的
nc $PRINTER_IP 9100 < $FILENAME;

如果需要打印包含中文字符的文本文件,可以转换为 PostScript 文件。在 macOS 上可以使用 paps。

brew install paps

使用 --font 参数指定字体字号。

# 使用 LiSong Pro 字体,10 号字
$ paps --font="LiSong Pro 10" sample.txt > sample.ps
$ nc my.laser.local 9100 < sample.ps

# 使用管道
paps --font="LiSong Pro 8" sample.txt | nc my.laser.local 9100

# 使用函数
function printthis() {
    paps --font="LiSong Pro 8" $1 | nc my.laser.local 9100
}

一种查看本机字体的方法是使用 fc-list

fc-list : file family |grep \/Library

双面打印

在安装了 CUPS 的系统上可以通过 lpstat -p -d 查看系统连接了哪些打印机。

$ lpstat -p -d

printer DocuCentre_V_3065_ is idle.  enabled since Sat 20 Nov 2021 08:17:16 AM CST
printer HP_Color_LaserJet_MFP_M281fdw_ is idle.  enabled since Sat 20 Nov 2021 08:17:17 AM CST
printer HP_LaserJet_MFP_M227sdn_ is idle.  enabled since Sat 20 Nov 2021 08:17:18 AM CST
printer HP_LaserJet_Pro_M428f_M429f_ is idle.  enabled since Sat 20 Nov 2021 08:17:18 AM CST
system default destination: HP_LaserJet_MFP_M227sdn_

默认打印机可以通过 lpoptions -d [打印机名称] 设置。

lpoptions -d HP_LaserJet_MFP_M227sdn_

双面打印只要修改 sides 参数(前提是打印机支持)。

lp -o sides=two-sided-short-edge testdoubleside.pdf