【EMR 编辑器 · 打印与续打详解】
打印对话框三种模式 · 区域打印怎么框选 · 续打标记的记录方式
编辑器的打印围绕医院场景设计:不是「整个网页打印」那种粗糙方式,而是纸张级精确输出——屏幕上的 A4 纸什么样,打出来就什么样(含页眉页脚、水印、表格跨页表头)。本篇讲打印对话框;对接本地打印机静默出纸见下一篇《静默打印对接》。
【一、打开打印对话框】
工具栏「文件▾ → 打印」打开内置打印对话框。上半部分是模式与选项,下半部分是逐页预览图。三种模式:
模式
干什么用
全部文档
整份文书一次打完
区域打印
只打某几段 / 某几页:预览图上拖框选区间,逐页配「打印 / 不打印」
未打印区域(续打)
自动定位还没打过的部分,从上次打印结束处继续
【二、区域打印:框到哪打到哪】
选「区域打印」后,在预览页上按住鼠标拖动即可框选区间(可跨页拖);
每页预览上方有「打印 / 不打印」开关——整页不要的页直接关掉;
框选边界有「行级原子裁剪」保证:你画到哪里,边线自动吸附到最近一行文字的边界——画出来的区域 = 实际打印的区域,绝不会出现「半行字」被切断的尴尬。
【三、续打:病历分段打印的正确姿势】
场景:病历写到第 5 页,先打了前 3 页交给病人;第二天又写了 2 页,现在要从第 4 页接着打,不重复不打漏。这就是续打。它的实现靠「续打标记」:
每次打印成功,编辑器自动记录这次打了哪个范围(块 id + 字符偏移锚定,编辑增删内容后仍能解析);
标记随文档 JSON 持久化(printMarks 字段)——明天打开病历,昨天打过什么依然记得;
打印预览中已打印区域绿色高亮,一眼看出打没打过;
选「未打印区域」模式,自动框出所有还没打过的区间,确认后直接打;
标记与留痕日志一样仅追加、undo 不回滚;手工管理:api.removePrintMark(id) 删标记、api.getPrintMarks() 查询。
【四、两个输出通道】
打印对话框里的「打印方式」二选一:
系统打印对话框:走浏览器自带打印(window.print 级别),零部署、任何环境可用;缺点是每次都弹预览窗、要点一次打印;
静默打印:选打印机 → 直接出纸,不弹任何窗口——护士站高频打印的刚需;需要部署一个本地打印代理(小 HTTP 服务),完整对接指南见下一篇。
无论哪种通道,打印成功都会记录续打标记——今天用系统对话框打,明天切静默打,标记体系通用。
【五、程序化打印 API(速览)】
不想用内置对话框、要自己做打印 UI 时,底层 API 全部开放(静默打印对接就是用它们搭的):
// 渲染第 0、1 页为 2 倍清晰度 PNG(blob: URL,用完记得 revokeObjectURL)
const urls = await api.renderPrintPages([0, 1], {
scale: 2,
showPrintMarks: true, // 预览叠加已打印高亮
onPage: (url, i) => {...}, // 每页就绪回调(渐进显示)
});
// 打印成功后手工记账(内置对话框自动做)
api.markPrinted(); // 缺省=整份文档
const todo = api.getUnprintedRanges(); // 未打印区间(续打定位)
const pages = api.resolvePrintPages(range); // 区域覆盖哪些页
提示:renderPrintPages 逐页异步编码并让出主线程,超长文档渲染期间不冻结 UI;区域裁剪坐标换算(posAtContentY / contentYAtPos / printRowBounds)一般只在做自定义区域选择器时才需要,详见《API 速查》。