核心功能

打印

静默出纸、等待打印结果、取消任务、查询任务列表,以及如何避免同一张单打两遍。

最后更新

打印是静默的:调用后不弹任何窗口,任务直接进入系统打印队列。

最简单的打印

await client.compose({ queueId })
  .addPdf(pdfBytes)
  .printAndWait();

compose() 是链式写法,.printAndWait() 会等到任务结束。想立刻返回、不等结果:

const job = await client.compose({ queueId }).addPdf(pdfBytes).print();
console.log(job.jobId);   // 任务已提交,用这个 id 查询

一次任务,不要循环

多页、多文件请永远用一次 compose() 或一份 items,不要按文件循环调用 print()——那会变成 N 条打印队列任务,用户会看到 N 条记录,出纸顺序也不再可控。 见组合打印。

等待打印结果

printAndWait() 返回终态:

status含义
completed出纸完成
failed失败,看 error
canceled被取消
const job = await client.compose({ queueId }).addPdf(bytes).printAndWait({
  onStatus: (event) => updateProgress(event.status),   // 可选:中间状态
});
if (job.status === 'failed') showError(job.error);

默认最多等 120 秒,可用 timeoutMs 调整。批量打印时不要串行等待,用 print() + 事件订阅自行汇总更快。

「完成」的可信度分三级

不同平台和驱动对「出纸完成」的确认能力不同,PrintLink 不掩盖这层差异, 终态任务会带 completionLevel:

  • device-reported —— 打印机自己报告完成,最可信;
  • spooler-completed —— 系统打印队列报告完成;
  • submitted —— 只确认已成功提交,之后的状态跟踪不到。

界面与代码都应按这个字段决定提示语的语气,不要一律显示「打印成功」。

取消任务

await client.cancelJob(jobId);        // 取消自己提交的任务(需 job.cancel 权限)

只能在任务还没出纸时取消。已经进入打印机的任务无法撤回。

查询任务

const job = await client.getJob(jobId);          // 单个任务详情
const jobs = await client.listJobs(50);          // 最近 50 条,仅限本站点提交的

任务详情里包含提交的参数、实际生效的参数、降级警告与状态时间线,可以据此向 用户解释「为什么和我选的不一样」。

桌面端控制台「任务」页可以看到所有任务(不只是自己站点提交的),支持搜索、 筛选、取消排队中的任务,并查看每页的渲染结果。任务产物默认保留 7 天, 可在设置里调整(1–365 天)。

避免同一张单打两遍

网络抖动或用户连点可能造成同一张单据打两次。给任务一个幂等键即可:

await client.compose({ queueId })
  .addPdf(bytes)
  .idempotencyKey(`invoice-${invoiceNo}`)   // 1–128 位可见 ASCII
  .printAndWait();

相同幂等键的重复提交会被抑制,只执行一次;被抑制的提交通过 onDuplicateSuppressed() 通知,可以据此告诉用户「这张单已经打过了」。

换成预览

把 .printAndWait() 换成 .preview() 即为「先让人确认再出纸」,参数完全一样。 见预览。

本页目录