人人都会AI编程

13.6 打印能力:静默打印、打印预览、页面打印

更新时间:2026-07-11

Tauri 应用可以直接利用系统 WebView 提供的打印接口,结合 Rust 后端实现从简单的弹窗打印到完全静默的自动打印。

页面打印(带系统对话框)

最直接的方式是在前端调用 window.print(),这会打开操作系统标准的打印对话框,用户可以在其中选择打印机、设置纸张方向和份数,并预览打印效果。

// 在任意前端框架或原生 JS 中
function handlePrint() {
  window.print();
}

如果需要控制打印样式(如隐藏导航栏、调整字体),使用 CSS 的 @media print 媒体查询即可:

@media print {
  .no-print { display: none; }
  body { font-size: 12pt; }
}

这种方式适合发票、报表、合同等需要用户确认参数的场景,无需任何额外配置。

打印预览

window.print() 弹出的系统对话框本身就包含了打印预览。如果你的应用需要在页面内展示一个“所见即所得”的预览效果,可以通过 CSS 媒体查询模拟打印样式,或者使用前端库(如 react-to-print)将打印内容渲染到一个预览区。但绝大多数情况下,系统对话框提供的预览功能已经足够,没有必要再造轮子。

静默打印(不弹出对话框)

静默打印是指程序直接将内容发送到打印机,不显示任何系统对话框,常用于 POS 小票、自动打单、自助终端等场景。由于 WebView 的安全限制,前端无法跳过打印对话框,必须通过 Rust 后端调用系统级打印接口。

推荐方案:使用 tauri-plugin-printer 插件
社区维护的 tauri-plugin-printer 插件封装了跨平台的静默打印能力,可以直接传入 HTML 或 PDF 内容并指定打印机。

首先安装插件并注册命令:

// 在 Rust 后端
use tauri_plugin_printer::Printer;

#[tauri::command]
fn silent_print(html: String, printer_name: Option<String>) -> Result<(), String> {
    let printer = Printer::default().map_err(|e| e.to_string())?;
    printer.print_html(&html, printer_name.as_deref()).map_err(|e| e.to_string())
}

前端调用:

import { invoke } from '@tauri-apps/api/tauri';

// 使用默认打印机
invoke('silent_print', { html: '<h1>静默打印内容</h1>', printerName: null });

// 指定打印机名称
invoke('silent_print', { html: '<p>票据...</p>', printerName: 'XP-58' });

备选方案:通过 PDF + 系统命令
如果不想依赖额外插件,也可以先生成 PDF 文件,再调用操作系统的打印命令静默输出。例如:

  • Windowspowershell -Command "Start-Process -FilePath 'file.pdf' -Verb Print"
  • macOSlp file.pdf
  • Linuxlp file.pdflpr file.pdf

在 Rust 中封装命令:

#[tauri::command]
fn print_pdf_silent(path: String) {
    #[cfg(target_os = "windows")]
    std::process::Command::new("powershell")
        .args(&["-Command", &format!("Start-Process -FilePath '{}' -Verb Print", path)])
        .spawn()
        .expect("静默打印失败");
    #[cfg(any(target_os = "macos", target_os = "linux"))]
    std::process::Command::new("lp")
        .arg(&path)
        .spawn()
        .expect("静默打印失败");
}

注意:这种方式要求目标系统已正确配置默认打印机,且应用有权限执行打印命令。

总结对照

| 打印方式 | 实现途径 | 是否弹窗 | 适用场景 |
|----------|----------|----------|----------|
| 页面打印 | window.print() | 是 | 用户需要选择参数或预览 |
| 打印预览 | 系统对话框自带 / CSS 模拟 | 可选 | 需要内嵌预览样式 |
| 静默打印 | Rust 插件或系统命令 | 否 | 自动化任务、小票、自助终端 |

根据你的业务需求选择合适的方案。大多数情况下 window.print() 已经能满足要求;需要静默打印时,建议优先使用 tauri-plugin-printer 等成熟插件,它可以平滑处理跨平台差异,大幅降低开发成本。