代码与工具 5 分钟阅读

旧打印机网页入口

家里那台 HP LaserJet 1020 用了快十年,除了换过两次硒鼓,一直没坏。但它有个毛病:只认 USB,而且驱动在 ma […]

旧打印机网页入口

家里那台 HP LaserJet 1020 用了快十年,除了换过两次硒鼓,一直没坏。但它有个毛病:只认 USB,而且驱动在 macOS 上越来越难搞。每次想打点东西,都得翻出那台旧笔记本,插线,开虚拟机,折腾半天。我就在想,能不能让它变成一个网页服务,手机点一下就能打。

先摸清家底

打印机连在一台树莓派 4B 上,系统是 Raspberry Pi OS。树莓派常年开着,跑着几个小服务。第一步是确认 CUPS 能正常驱动这台老家伙。装好 cups 和 hplip 之后,浏览器打开树莓派的 631 端口,添加打印机,选 USB 连接,驱动选 HP LaserJet 1020。打一张测试页,出来了,说明底层是通的。

这里有个坑:1020 是主机型打印机,需要固件上传。hplip 会自动处理,但第一次打印时会卡几秒。我在 CUPS 里把「启用双向通信」关掉,速度就正常了。

写个最小的上传页

我不想装完整的打印管理面板,太重。目标就是一个页面:选文件,点打印,完事。后端用 Flask,因为树莓派上已经跑着一个 Flask 服务,复用环境最省事。

核心逻辑就三步:接收文件,转成 PDF(如果传的是图片或文本),调 lp 命令发给 CUPS。lp 是 CUPS 自带的命令行工具,比调 API 简单。

import subprocess
from flask import Flask, request, render_template

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
f = request.files['file']
path = '/tmp/print_' + f.filename
f.save(path)
subprocess.run(['lp', '-d', 'HP_LaserJet_1020', path], check=True)
return '已发送到打印机'
return render_template('index.html')

前端就是一个 form,加个 file input 和 submit 按钮。样式?没有,原生按钮够用。

处理常见的文件类型

直接传 PDF 没问题,但手机拍的照片是 JPG,传上去 lp 不认识。得加一层转换。树莓派上装了 ImageMagick,用 convert 把图片转成 PDF。文本文件更简单,直接 lp 就能打,但中文会乱码,得先 enscript 或 paps 转一下。

我的做法是按扩展名分流:.pdf 直传,.jpg/.png 用 convert 转 PDF,.txt 用 paps 转 PDF。paps 对中文支持不错,装好中文字体就行。

if filename.endswith(('.jpg', '.jpeg', '.png')):
subprocess.run(['convert', path, path + '.pdf'])
path = path + '.pdf'
elif filename.endswith('.txt'):
subprocess.run(['paps', path, '>', path + '.pdf'], shell=True)
path = path + '.pdf'

注意 shell=True 那里有注入风险,但这是内网自用,我认了。真要对外,得用 subprocess 的列表参数重写。

加一点便利性

页面能用了,但每次都要开浏览器输 IP,还是麻烦。我在路由器上给树莓派固定了 IP,然后在手机主屏加了个快捷方式,指向 http://192.168.1.10:5000。点一下就能打开上传页。

另一个小改进是打印队列状态。lpstat -o 能列出待打印任务,我在页面底部加了一行,每 10 秒刷新一次。这样打完能立刻看到任务是不是被接收了,不用跑去打印机旁边等。

还有个小细节:打印完成后自动删除 /tmp 里的临时文件。不然树莓派的 SD 卡迟早被塞满。在 lp 命令后面加个 rm 就行。

现在怎么用

手机拍张照片,打开快捷方式,选图,点打印。十秒后打印机开始响。整个过程不用碰电脑,不用插线。上周给娃打涂色卡,直接在相册里选了一张,比之前开电脑找驱动快多了。

这个入口没有用户系统,没有权限控制,就是个内网小工具。但它解决了一个具体问题:让一台老打印机重新变得顺手。有时候所谓「智能化」,不需要换新设备,只需要在旧设备前面加一层薄薄的网页。

留下你的回声