AngularJS项目如何统计实体打印机实际打印次数,排除取消与PDF打印场景
实现思路
由于浏览器隐私权限限制,无法100%精准识别实体打印机打印成功的状态,但可以通过以下方案最大程度贴合你的需求:
- 将计数逻辑从点击触发改为打印流程结束后触发,排除用户在预览页取消打印的场景
- 对打印机名称做关键词过滤,排除打印为PDF/虚拟打印机的场景
调整后的代码
vm.printWholeJob = function () { setTimeout(function () { var popupWin = window.open('', '_blank', 'width=1000,height=600'); popupWin.document.write('<html><head><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"><style>.print-table th, .print-table td {border: 1px solid #34495E !important;} .print-table td, .print-table th {padding-bottom:5px !important;padding-top: 5px !important;}@page {margin-top: 5.0cm;margin-bottom: 3.0cm;margin-right:1.8cm;}.data{page-break-before: always;}</style></head><body>' + document.querySelector('#job-to-print').innerHTML + '</html>'); // 绑定打印完成事件 popupWin.onafterprint = async function() { let isValidPrint = false; // 优先用支持Web Print API的浏览器获取打印机信息 if ('print' in navigator && 'requestPrinter' in navigator) { try { const printer = await navigator.printer.requestPrinter(); const printerName = printer.name.toLowerCase(); // 过滤虚拟打印机关键词,可根据实际场景补充 const invalidKeywords = ['pdf', 'xps', '打印到文件', 'microsoft print to pdf', 'foxit reader printer', 'wps pdf']; const hasInvalidKeyword = invalidKeywords.some(keyword => printerName.includes(keyword)); if (!hasInvalidKeyword) { isValidPrint = true; } } catch (e) { // 用户拒绝授权打印机访问权限时,可根据业务规则选择是否计数 isValidPrint = false; } } else { // 不支持Web Print API的浏览器,可根据业务规则选择是否计数,默认不计入避免误统计 isValidPrint = false; } if (isValidPrint) { vm.printCount++; // 这里可以加逻辑把计数同步到后端持久化存储 } popupWin.close(); }; setTimeout(() => { popupWin.print(); }, 500); }, 800); };
注意事项
- Web Print API目前仅部分 Chromium 内核浏览器支持,使用前需要用户授权打印机访问权限
- 虚拟打印机的关键词过滤规则需要根据你业务覆盖的用户场景补充,无法覆盖所有极端场景
- 如果需要更高准确率的统计,可以在前端上报打印记录后,结合实体打印机的后台日志做二次校验匹配
内容的提问来源于stack exchange,提问作者Ankit Prasad
相关产品推荐
相关产品推荐

