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 文件,再调用操作系统的打印命令静默输出。例如:
- Windows:
powershell -Command "Start-Process -FilePath 'file.pdf' -Verb Print" - macOS:
lp file.pdf - Linux:
lp file.pdf或lpr 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 等成熟插件,它可以平滑处理跨平台差异,大幅降低开发成本。