Appearance
打印管理功能
**本文档引用的文件** - [print.js](file://dm/lemes-web/src/utils/print.js) - [local-print.js](file://dm/lemes-web/src/utils/local-print.js) - [LodopFuncs.js](file://dm/lemes-web/src/utils/LodopFuncs.js) - [htmlToPdf.js](file://dm/lemes-web/src/utils/htmlToPdf.js) - [local-service.js](file://dm/lemes-web/src/utils/local-service.js) - [localService.js](file://dm/lemes-web/src/utils/localService.js) - [localServiceForPrint.js](file://dm/lemes-web/src/utils/localServiceForPrint.js) - [printer.js](file://dm/lemes-web/src/views/devicemate/api/system/printer.js) - [printer-config.js](file://dm/lemes-web/src/views/devicemate/config/api/system/printer.js)目录
简介
本文件系统性梳理 DeviceMate 项目的打印管理功能,覆盖以下方面:
- 打印架构与实现模式:Lodop 打印控件集成、本地打印服务方案、HTML 转 PDF 的实现原理与页面布局优化。
- 打印配置管理:打印机信息的增删改查、分页查询、按用户筛选等接口。
- 打印模板设计与批量打印:基于本地服务的 BarTender 模板、ZPL 模板、激光打印机模板的打印流程;HTML 标签页打印与批量处理。
- 使用示例、常见问题与性能优化建议:包括打印预览、打印设置、打印状态监控的实现要点。
项目结构
围绕打印功能的关键目录与文件组织如下:
- 工具层(utils)
- print.js:通用 HTML 打印封装(iframe 内嵌打印)。
- htmlToPdf.js:HTML 转 PDF 的 Vue 插件封装。
- local-print.js:本地服务打印入口(打印机列表、模板打印)。
- local-service.js:本地服务健康检查、版本检测与下载安装流程。
- localService.js:本地服务通用工具(文件读写、命令执行、版本升级)。
- localServiceForPrint.js:打印全流程编排(Bartender/ZPL/Lodop/HTML 打印)、变量解析、批量打印。
- LodopFuncs.js:Lodop 控件加载、跨平台兼容与安装引导。
- 配置与 API 层(views/devicemate)
- printer.js:打印机信息的 API 调用封装。
- printer-config.js:打印机相关 API 基础路径配置。
图表来源
- print.js:1-162
- htmlToPdf.js:1-40
- local-print.js:1-75
- local-service.js:1-118
- localService.js:1-237
- localServiceForPrint.js:1-464
- LodopFuncs.js:1-182
- printer.js:1-60
- printer-config.js:1-33
章节来源
- print.js:1-162
- htmlToPdf.js:1-40
- local-print.js:1-75
- local-service.js:1-118
- localService.js:1-237
- localServiceForPrint.js:1-464
- LodopFuncs.js:1-182
- printer.js:1-60
- printer-config.js:1-33
核心组件
- 通用 HTML 打印(print.js)
- 功能:收集样式与表单元素状态,注入隐藏 iframe,触发打印,支持 beforeprint/afterprint 回调。
- 关键点:通过选择器收集样式与链接资源,序列化表单控件状态,避免打印时丢失数据。
- HTML 转 PDF(htmlToPdf.js)
- 功能:基于 html2canvas 与 jspdf,将指定 DOM 区域渲染为 PDF,支持多页拼接与 A4 尺寸适配。
- 关键点:计算缩放比例、分页策略、保存文件名。
- 本地打印服务(local-print.js + local-service.js + localService.js + localServiceForPrint.js)
- 功能:本地服务健康检查与版本升级、下载安装包;模板打印(ZPL/激光)、BarTender 模板打印、HTML 标签页打印、Lodop 打印与预览。
- 关键点:统一的本地服务通信协议、错误提示与国际化消息、批量打印与变量解析。
- Lodop 打印控件(LodopFuncs.js)
- 功能:跨平台判断、动态加载 CLodop 或 IE 插件、安装引导弹窗、版本检测与升级提示。
- 关键点:针对不同浏览器与系统环境的兼容性处理。
- 打印机配置 API(printer.js + printer-config.js)
- 功能:分页查询、保存、更新、删除、批量删除、按用户获取打印机列表等。
- 关键点:统一的 API 路径配置与请求封装。
章节来源
- print.js:1-162
- htmlToPdf.js:1-40
- local-print.js:1-75
- local-service.js:1-118
- localService.js:1-237
- localServiceForPrint.js:1-464
- LodopFuncs.js:1-182
- printer.js:1-60
- printer-config.js:1-33
架构总览
整体打印架构分为三层:
- 前端工具层:负责打印能力封装与跨平台兼容(print.js、htmlToPdf.js、LodopFuncs.js、local-print.js、local-service.js、localService.js、localServiceForPrint.js)。
- 本地服务层:提供文件读写、命令执行、模板变量解析、打印任务调度等能力。
- 后端 API 层:提供打印机配置管理接口,供前端进行增删改查与分页查询。
图表来源
- print.js:1-162
- htmlToPdf.js:1-40
- local-print.js:1-75
- local-service.js:1-118
- localServiceForPrint.js:1-464
- LodopFuncs.js:1-182
- printer.js:1-60
详细组件分析
组件一:通用 HTML 打印(print.js)
- 设计要点
- 支持传入 DOM 选择器或 Vue 实例,自动定位根节点。
- 收集样式与链接资源,确保打印样式完整。
- 序列化表单控件(复选框、单选框、文本框、下拉框),避免打印时丢失数据。
- 通过隐藏 iframe 注入内容,触发打印,支持打印前后回调。
- 处理逻辑
- 初始化:合并样式与 HTML。
- 写入 iframe:打开、写入、关闭。
- 触发打印:优先使用 document.execCommand('print'),失败回退至 window.print()。
- 清理:延时移除 iframe 并回调 afterprint。
图表来源
章节来源
组件二:HTML 转 PDF(htmlToPdf.js)
- 设计要点
- 基于 html2canvas 将 DOM 转为 Canvas,再由 jspdf 输出 PDF。
- 计算 A4 尺寸下的缩放比例,支持整页填充与纵向/横向布局。
- 对超长内容进行分页追加,最终保存 PDF 文件。
- 处理逻辑
- 获取目标 DOM 宽高与页面高度。
- 计算图片宽度与高度,生成 base64 数据。
- 循环添加页面并保存 PDF。
图表来源
章节来源
组件三:本地打印服务(local-print.js + local-service.js + localService.js + localServiceForPrint.js)
- 设计要点
- 本地服务健康检查与版本升级:通过本地 9001 端口探测服务状态,必要时引导下载安装包。
- 模板打印:支持 ZPL 与激光打印机模板,按类型路由到对应接口。
- 打印编排:统一入口 startPrint,根据 configType 选择 BarTender、ZPL、Lodop 或 HTML 打印。
- BarTender 模板:检查模板文件是否存在,不存在则写入;支持变量解析与 mock 文件关联。
- HTML 标签页打印:将 HTML 列表转换为图片或 PDF,再通过本地服务打印。
- Lodop 打印:封装 PRINT/PRINTA/PREVIEW 三种模式,支持指定打印机索引。
- 关键流程(模板打印)
图表来源
关键流程(BarTender 模板打印)
图表来源
章节来源
组件四:Lodop 打印控件(LodopFuncs.js)
- 设计要点
- 跨平台判断:移动端、Edge、Firefox、Opera、Chrome 等环境下优先使用 CLodop。
- 动态加载:从本地 8000/18000 端口加载 CLodop,避免端口占用。
- 安装引导:根据浏览器类型弹出安装/升级提示,支持下载链接与协议链接。
- 版本检测:对 LODOP 版本进行检测,必要时提示升级。
- 关键流程
图表来源
章节来源
组件五:打印配置管理(printer.js + printer-config.js)
- 设计要点
- 统一的 API 路径配置文件,便于集中维护。
- 提供分页查询、保存、更新、删除、批量删除、按用户获取列表等接口封装。
- 关键接口
- 分页查询:pageAjax(params)
- 保存:saveAjax(params)
- 更新:updateAjax(params)
- 删除:deleteAjax(id)
- 批量删除:batchesDeleteAjax(params)
- 获取详情:getPrinterAjax(id)
- 获取当前用户列表:getPrinterListByActiveUserAjax(params)
图表来源
章节来源
依赖关系分析
- 组件耦合
- local-print.js 依赖 local-service.js 进行本地服务检测与下载。
- localServiceForPrint.js 统一编排打印流程,依赖 LodopFuncs.js(Lodop)、localService.js(文件系统与命令执行)、html2canvas/jspdf(HTML 转 PDF/图片)。
- print.js 与 htmlToPdf.js 作为通用能力被上层打印流程复用。
- 外部依赖
- 浏览器打印栈(execCommand/print)、Lodop 控件、本地服务进程(9001 端口)。
- 潜在风险
- 本地服务不可用时的降级策略(引导安装/切换打印方式)。
- 不同浏览器对 html2canvas/jspdf 的兼容性差异。
图表来源
- print.js:1-162
- htmlToPdf.js:1-40
- local-print.js:1-75
- local-service.js:1-118
- localServiceForPrint.js:1-464
- LodopFuncs.js:1-182
- printer.js:1-60
- printer-config.js:1-33
章节来源
- print.js:1-162
- htmlToPdf.js:1-40
- local-print.js:1-75
- local-service.js:1-118
- localServiceForPrint.js:1-464
- LodopFuncs.js:1-182
- printer.js:1-60
- printer-config.js:1-33
性能考虑
- HTML 转 PDF
- 控制截图区域尺寸与 html2canvas 的宽高参数,减少内存占用与渲染时间。
- 对超长内容采用分页策略,避免一次性生成大体积 PDF。
- 本地打印
- BarTender 模板写入与变量解析仅在首次缺失时执行,后续复用以降低开销。
- 批量打印时尽量合并请求,减少本地服务往返次数。
- Lodop 打印
- 预览与直接打印分离,避免不必要的打印动作。
- 在移动端或不支持插件的环境中优先使用 CLodop,减少失败重试成本。
故障排查指南
- 本地服务未启动/版本不匹配
- 现象:调用本地服务接口报网络错误或版本不一致。
- 排查:检查本地服务进程状态、端口占用情况;根据提示下载安装最新版本。
- 参考
- BarTender 模板缺失或变量解析失败
- 现象:打印失败并提示检查模板文件或变量。
- 排查:确认模板文件路径与名称;若缺失则写入模板并重新解析变量。
- 参考
- HTML 打印样式异常
- 现象:打印样式丢失或布局错乱。
- 排查:确认传入的样式选择器与链接资源;检查表单控件序列化逻辑。
- 参考
- Lodop 控件加载失败
- 现象:无法获取 LODOP 实例或版本过低。
- 排查:检查浏览器类型与端口占用;根据提示安装/升级 Lodop。
- 参考
章节来源
- local-service.js:1-118
- local-print.js:1-75
- localServiceForPrint.js:1-464
- print.js:1-162
- LodopFuncs.js:1-182
结论
DeviceMate 的打印管理功能通过“前端工具层 + 本地服务 + 后端 API”的分层设计,实现了对多种打印场景的支持:
- 通用 HTML 打印与 HTML 转 PDF 保证了页面样式的可控输出;
- 本地服务提供了 BarTender、ZPL、激光打印与 HTML 标签页打印的统一编排;
- Lodop 控件在跨平台场景下提供稳定的打印体验;
- 打印机配置 API 保障了打印设备管理的灵活性。
建议在生产环境中结合业务场景选择合适的打印路径,并完善本地服务与浏览器兼容性的监控与告警。
附录
- 使用示例(路径指引)
- 通用 HTML 打印:print.js:3-18
- HTML 转 PDF:htmlToPdf.js:5-39
- 本地模板打印(ZPL/激光):local-print.js:43-74
- BarTender 模板打印:localServiceForPrint.js:155-180
- HTML 标签页打印(图片/PDF):localServiceForPrint.js:57-68
- Lodop 打印/预览:localServiceForPrint.js:423-441
- 打印机配置管理:printer.js:1-60