Tampermonkey脚本无法按文件名指定打印机问题排查
问题原因及解决方案
为什么当前脚本无法指定打印机
window.print()不支持printerName参数
浏览器原生的window.print()方法根本没有接收printerName的参数定义,你传入的这个配置完全不会被浏览器识别,自然无法切换打印机,只会走默认的打印流程。跨标签上下文权限限制
新打开的标签页和原脚本所在页面是独立的执行上下文,哪怕你通过fileWindow引用了新窗口,也没办法直接修改其打印对话框的默认设置——浏览器的安全策略明确限制了这类跨上下文的敏感操作。
可行的实现方案
要实现自动指定打印机,得用Chromium内核浏览器(Edge基于此)提供的chrome.printing API,同时调整脚本的权限和执行逻辑:
步骤1:添加Tampermonkey权限声明
在脚本最开头添加权限申请,确保能调用打印API并连接打印机:
// ==UserScript== // @name 自动选择打印机打印文件 // @namespace http://tampermonkey.net/ // @version 0.1 // @description 根据文件名自动匹配打印机打印 // @author You // @match 你的目标页面完整URL // @grant chrome.printing // @grant chrome.runtime // @connect 182.060.200.146 // @connect 182.50.16.18 // ==/UserScript==
步骤2:替换打印逻辑为chrome.printing API调用
不再通过新标签页打开文件后调用print(),直接用打印API指定打印机提交任务:
(function() { 'use strict'; // 定义文件名与打印机名称的映射(打印机名称要和系统显示的完全一致) const printerMap = { 'nameofthefirstfile': 'Zebra打印机完整名称', 'nameofthesecondfile': 'HP打印机完整名称' }; // 获取页面上的文件链接 const fileLinks = document.querySelectorAll('.docs-list li a'); // 缓存系统打印机列表 let printerList = []; chrome.printing.getPrinters().then(printers => { printerList = printers; }); // 提交指定打印机的打印任务 async function printWithTargetPrinter(fileUrl, targetPrinterName) { // 查找目标打印机 const targetPrinter = printerList.find(p => p.name === targetPrinterName); if (!targetPrinter) { alert(`未找到打印机:${targetPrinterName}`); return; } // 构造打印请求参数 const printJob = { printerId: targetPrinter.id, jobName: '自动打印文件', ticket: { version: '1.0', print: {} }, document: { url: fileUrl, contentType: 'application/pdf' // 根据文件类型调整,比如网页用text/html } }; // 提交打印任务 try { await chrome.printing.submitJob(printJob); console.log(`已提交打印任务到:${targetPrinterName}`); } catch (err) { console.error('打印失败:', err); alert('打印失败,请检查打印机连接'); } } // 给每个文件链接绑定点击事件 fileLinks.forEach(link => { link.addEventListener('click', async (e) => { e.preventDefault(); const fileName = link.innerText.trim(); const targetPrinter = printerMap[fileName]; if (targetPrinter) { await printWithTargetPrinter(link.href, targetPrinter); } else { alert(`未配置${fileName}对应的打印机`); } }); }); })();
关键注意点
- 打印机名称必须准确:你可以先在Edge的
chrome://print/页面查看打印机的完整名称,完全匹配才能找到目标设备。 - 文件类型要对应:修改
printJob.document.contentType为你的文件实际类型,比如PDF用application/pdf,普通网页用text/html。 - 权限必须授予:首次运行脚本时,浏览器会弹出权限申请提示,必须同意才能正常调用打印API。
内容的提问来源于stack exchange,提问作者infl
相关产品推荐
相关产品推荐

