实用脚本能批量打印吗?

wen 实用脚本 11

本文目录导读:

实用脚本能批量打印吗?

  1. 场景一:批量打印网页中的“指定内容”(如收据、单据、证书、标签等)
  2. 场景二:批量打印文件夹中的“文件”(如PDF、Word、图片)
  3. 场景三:批量打印服务器/后台“报表”
  4. 总结建议:

这是一个非常实用的问题,答案是:绝对可以,但“批量打印”在网页端(浏览器端)有非常严格的安全限制

为了帮你找到最实用的方案,我把“批量打印”分成了几种常见场景,你可以看看哪种最符合你的需求:

批量打印网页中的“指定内容”(如收据、单据、证书、标签等)

这是大部分“实用脚本”的使用场景,由于浏览器为了防止恶意弹窗,默认禁止直接弹出多个打印对话框,所以有以下几种变通方案:

  1. 方案A:拼接打印(最推荐、最通用)

    • 原理:不打开多个打印窗口,而是将所有的内容(比如100张收据)拼接到一个新窗口的同一张(或连续)页面上,然后只打印一次
    • 实现:遍历数据,生成一个巨大的HTML字符串(包含所有内容,中间用 page-break-after: always;<div style=“page-break-before: always;”></div> 分页),最后调用 window.print()
    • 优点:稳定、不会触发弹窗拦截、用户只需点一次确定。
    • 缺点:不适合需要单独装订或单独发送的场景。
  2. 方案B:静默打印(插件/专属协议)

    • 原理:绕过浏览器对话框,直接发送到打印机。
    • 实现
      • Chrome/Edge专属:使用 --kiosk-printing 启动参数,启动浏览器时加上这个参数,再调用 window.print() 就不会弹出对话框,直接打印(需要预先设置好默认打印机)。
      • ActiveX控件(仅IE,已过时):在老旧内网系统中,使用 new ActiveXObject(“Scripting.FileSystemObject”) 配合打印控件。
    • 优点:真正意义上的“一键批量打印”。
    • 缺点:配置麻烦(需要修改浏览器启动参数),仅限Chrome或Edge,不适合普通网页用户。
  3. 方案C:逐个弹出(风险高,不推荐)

    • 原理:使用 setTimeoutrequestAnimationFrame 循环调用 window.open()print
    • 实现:循环数组,每1000毫秒打开一个新窗口并打印,然后关闭。
    • 风险极大概率被浏览器拦截弹出窗口,用户需要手动允许放行(允许一次后后续可能仍然拦截),体验极差。

推荐脚本流程(方案A):

<!DOCTYPE html>
<html>
<head>
<meta charset=“UTF-8”>批量打印示例(拼接模式)</title>
<style>
    /* 定义每张标签/单据的样式 */
    .item {
        width: 200px;
        height: 100px;
        border: 1px solid black;
        margin: 10px auto;
        padding: 10px;
        box-sizing: border-box;
    }
    @media print {
        body { margin: 0; padding: 0; }
        .item {
            page-break-after: always;  /* 每打印一项就换页 */
            margin: 0 auto;
        }
    }
</style>
</head>
<body>
<button id=“batchPrintBtn”>批量打印5张单据</button>
<script>
    const data = [
        { name: “张三”, order: “1001” },
        { name: “李四”, order: “1002” },
        { name: “王五”, order: “1003” },
        { name: “赵六”, order: “1004” },
        { name: “孙七”, order: “1005” }
    ];
    document.getElementById(‘batchPrintBtn’).addEventListener(‘click’, function() {
        // 1. 创建新窗口
        const printWindow = window.open(‘’, ‘_blank’);
        // 2. 拼接所有内容的HTML(避免逐个打开)
        let printContent = ‘<html><head><style>’;
        printContent += ‘.item { width: 200px; height: 100px; border: 1px solid black; margin: 10px auto; padding: 10px; }’;
        printContent += ‘@media print { .item { page-break-after: always; } }’;
        printContent += ‘</style></head><body>’;
        data.forEach(item => {
            printContent += `<div class=“item”>
                <p>姓名: ${item.name}</p>
                <p>订单号: ${item.order}</p>
            </div>`;
        });
        printContent += ‘</body></html>’;
        // 3. 写入新窗口并打印
        printWindow.document.write(printContent);
        printWindow.document.close();
        printWindow.focus();
        // 关键:等页面渲染完成后再打印
        setTimeout(() => {
            printWindow.print();
            // 打印后可以关闭窗口(部分浏览器可能不自动关闭)
            // printWindow.close();
        }, 500);
    });
</script>
</body>
</html>

批量打印文件夹中的“文件”(如PDF、Word、图片)

注意:纯浏览器脚本(JavaScript)无法直接操作本地文件系统。

要批量打印本地文件,你需要使用:

  • 操作系统自带功能
    • Windows:选中所有文件(Ctrl+A),右键点击,选择“打印”。(只能打印图片和部分文本,PDF不行)。
    • macOS:选中PDF文件,在Finder中右键,快速操作 -> 打印(可以批量打印PDF)。
  • 专业软件
    • Adobe Acrobat Pro(支持批量PDF打印)。
    • BatchPrint(专用批量打印软件)。
    • 编写AutoHotkey(AHK)或Python脚本(调用系统打印命令)。

批量打印服务器/后台“报表”

这是最正统的“批量打印”应用场景,通常由后端完成:

  • 原理:后端生成一个包含所有报表的PDF文件(使用如 iText、Puppeteer(无头浏览器)、wkhtmltopdf)。
  • 流程:用户点击“批量打印” -> 后端生成一个大PDF -> 返回给浏览器 -> 浏览器直接打开PDF并弹出打印框。
  • 优点:不受浏览器窗口弹出限制,用户可以一次预览所有内容,稳定性极高。
  • 适用:企业内部系统、账单系统、物流面单打印。

总结建议:

你的需求场景 推荐方案 难度 备注
打印网页中的数据(收据、标签) 方案A:拼接打印 最稳定、代码量最少
一键静默打印(无需弹窗) 方案B:Chrome专属启动参数 ⭐⭐⭐ 需要修改浏览器设置
打印本地文件夹里的图片/PDF 系统右键打印 / 专业软件 脚本干不了这个
服务器后台批量导出报表 后端生成PDF(Puppeteer等) ⭐⭐⭐⭐ 最适合企业级应用

如果你只是想快速实现 “网页上勾选几项,然后点一下批量打印”,直接用我上面给的 方案A(拼接模式) 代码改改就行,这是最实用的。

抱歉,评论功能暂时关闭!