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

Tampermonkey脚本无法按文件名指定打印机问题排查

问题原因及解决方案

为什么当前脚本无法指定打印机

  1. window.print()不支持printerName参数
    浏览器原生的window.print()方法根本没有接收printerName的参数定义,你传入的这个配置完全不会被浏览器识别,自然无法切换打印机,只会走默认的打印流程。

  2. 跨标签上下文权限限制
    新打开的标签页和原脚本所在页面是独立的执行上下文,哪怕你通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:23:17