核心功能
打印机与配置档
列出打印机、看实时状态与真实能力、保存常用参数为配置档。
最后更新
列出打印机
const { queues, devices } = await client.listPrinters();queues—— 可以打印的目标,queueId就是传给compose({ queueId })的值。devices—— 物理设备分组,同一台机器可能以多个队列出现(比如同时有不同的 驱动或纸盒配置)。
每个队列都带实时状态:
| 字段 | 说明 |
|---|---|
isSystemDefault | 是操作系统的默认打印机 |
isUserPreferred | 用户在 PrintLink 控制台里设为「首选」的 |
status.state | ready / printing / paused / offline 等 |
status.reasons | 状态原因码(缺纸、卡纸、门打开…) |
挑选目标时的常见顺序:用户首选 → 系统默认 → 列表第一个。见 快速上手第 3 步。
实时状态
const status = await client.printerStatus(queueId);状态也会在变化时推送,不必轮询:
const off = client.onPrinterStatusChanged((event) => {
if (event.status.state === 'offline') notifyUser('打印机离线了');
});读取真实能力
不要猜打印机支持什么,直接读:
const caps = await client.getCapabilities(queueId);
caps.media.supported; // 支持的纸张
caps.media.ready; // 当前已装载、可直接用的纸张
caps.media.customSize; // 能否自定义尺寸,以及范围
caps.duplex.modes; // 支持的双面模式
caps.color.supported; // 能不能彩色
caps.copies; // 份数范围
caps.mediaTypes.supported; // 纸张类型(照片纸、投影片…)
caps.borderless; // 能否无边框界面应该只展示这里列出的选项——给用户一个选了会被丢弃的选项,比不显示它 更糟。控制台「打印机 → 能力」页把这些能力可视化,并可一键刷新。
能力会缓存
getCapabilities(queueId) 返回缓存结果,读取很快。打印机换了驱动或改了配置时
传 refresh: true 强制重读。
配置档:保存常用参数
同一台打印机反复使用同一套参数(比如标签纸 + 高质量 + 特定纸盒)时,存成 配置档,打印时引用:
// 用打印机当前的原生配置新建
const profile = await client.createProfileFromNative(queueId, '标签纸 · 高质量');
// 再补上跨平台的标准选项
await client.setProfileStandard(profile.id, { copies: 1, quality: 'best' });
// 设为这台打印机的默认配置档
await client.setDefaultProfile(profile.id);
// 打印时引用
await client.compose({ queueId }).profile(profile.id).addDocument(doc).printAndWait();一个配置档分两层:
- 标准选项——跨平台统一的参数(份数、纸张、双面、质量…),可以直接在控制台编辑, 单次打印时也能覆盖。
- 原生参数——驱动私有的完整配置快照(Windows DEVMODE、CUPS/IPP 选项等), 用「从当前原生配置新建」从打印机当前状态捕获。这部分只保存在本机,绝不通过网络传出。
配置档什么时候会失效
打印机换驱动、改配置后,旧配置档里的原生参数可能已经不适用。PrintLink 不会 硬套,而是标注状态:
| 状态 | 含义 |
|---|---|
| 有效 | 与当前打印机匹配,可以放心用 |
| 需复核 | 打印机能力或驱动变了,建议重新捕获 |
| 已失效 | 已无法应用到当前打印机 |
打印时引用失效配置档会得到 PROFILE_NOT_FOUND,应引导用户去控制台重新设置。
其他打印机操作
client.setPreferredPrinter(queueId); // 设为「首选」(会显示在列表里)
client.openPrinterSettings(queueId); // 打开系统打印机设置(需 printer.settings 权限)
client.listProfiles(queueId); // 查配置档(需 profile.read)
client.renameProfile(id, '新名字');
client.deleteProfile(id);