You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 19:06:06