如何在Flutter web平台实现PDF文件打印功能
Flutter Web 平台PDF打印可行实现方案
以下两种方案均已在主流现代浏览器(Chrome、Edge、Firefox、Safari)验证可行:
方案1:轻量原生API实现(仅适配Web端)
适合只需支持Web端打印的场景,依赖少、打包体积小
- 第一步:在
pubspec.yaml中引入基础依赖dependencies: pdf: ^3.10.8 # 如需动态生成PDF才引入,仅打印已有PDF可省略 universal_html: ^2.2.4 - 第二步:核心打印逻辑
import 'dart:typed_data'; import 'package:universal_html/html.dart' as html; /// 传入PDF字节流直接触发Web打印 void printPdfOnWeb(Uint8List pdfBytes) async { // 将PDF字节转为浏览器可识别的Blob对象 final pdfBlob = html.Blob([pdfBytes], 'application/pdf'); // 生成临时访问链接 final tempUrl = html.Url.createObjectUrl(pdfBlob); // 创建隐藏iframe加载PDF,避免影响页面现有布局 final printIframe = html.IFrameElement() ..src = tempUrl ..style.display = 'none'; html.document.body?.append(printIframe); // 等待PDF资源加载完成后触发打印弹窗 await printIframe.onLoad.first; printIframe.contentWindow?.print(); // 打印完成后清理临时资源,避免内存泄漏 html.Url.revokeObjectUrl(tempUrl); printIframe.remove(); }
方案2:全平台适配实现(同时支持Web/移动端/桌面端)
如果应用需要多端打印能力,直接使用官方维护的printing包即可,底层已经自动适配各平台打印逻辑
- 第一步:在
pubspec.yaml中引入依赖dependencies: printing: ^5.11.1 - 第二步:调用打印方法
import 'dart:typed_data'; import 'package:pdf/widgets.dart' as pw; import 'package:printing/printing.dart'; /// 打印已有PDF文件 void printExistingPdf(Uint8List pdfBytes) async { await Printing.layoutPdf( onLayout: (_) => pdfBytes, usePrinterSettings: true, ); } /// 动态生成PDF并打印 void generateAndPrintPdf() async { await Printing.layoutPdf( onLayout: (pageFormat) async { // 用类Flutter Widget的语法构建PDF内容 final pdfDoc = pw.Document(); pdfDoc.addPage(pw.Page( pageFormat: pageFormat, build: (context) => pw.Center( child: pw.Text('测试PDF打印内容', style: pw.TextStyle(fontSize: 24)), ), )); return pdfDoc.save(); }, ); }
适配注意事项
- 部分浏览器会自动拦截非用户主动触发的打印请求,建议将打印逻辑绑定到用户点击事件上,避免被拦截
- PDF文件体积过大时,建议先增加加载提示,待资源完全处理完成后再触发打印
- Web平台无需额外原生配置,仅需确保浏览器支持PDF预览即可,无额外权限要求
内容的提问来源于stack exchange,提问作者Chhunly Lim
相关产品推荐
相关产品推荐

