Flutter中自动生成指定名称PDF并附加到邮件发送的实现问题
实现自动生成PDF并附加到邮件发送的解决方案
步骤1:添加所需依赖
在pubspec.yaml中添加以下依赖:
dependencies: flutter: sdk: flutter printing: ^5.12.0 pdf: ^3.10.0 path_provider: ^2.1.1 flutter_email_sender: ^6.0.1
执行flutter pub get安装依赖。
步骤2:修改PDF生成逻辑,自动保存到本地
将原有的PDF生成逻辑改为异步方法,自动生成带预定义名称的PDF并保存到本地存储:
import 'dart:io'; import 'package:path_provider/path_provider.dart'; import 'package:flutter_email_sender/flutter_email_sender.dart'; // 全局key用于捕获目标Widget final GlobalKey printKey = GlobalKey(); Future<void> generateAndSendPdf() async { // 1. 构建PDF文档 final doc = pw.Document(); final image = await WidgetWraper.fromKey( key: printKey, pixelRatio: 2.0, ); doc.addPage(pw.Page( pageFormat: PdfPageFormat.a4, // 预定义页面格式,无需手动选择 build: (pw.Context context) { return pw.Center( child: pw.Expanded(child: pw.Image(image)), ); }, )); // 2. 获取本地存储路径,使用临时目录无需额外权限 final directory = await getTemporaryDirectory(); // 用时间戳做后缀避免文件名重复 final fileName = "屏幕截图_${DateTime.now().millisecondsSinceEpoch}.pdf"; final file = File('${directory.path}/$fileName'); // 3. 将PDF写入本地文件 await file.writeAsBytes(await doc.save()); // 4. 触发邮件发送 await sendEmailWithAttachment(file.path); }
步骤3:实现邮件发送功能
编写邮件发送方法,配置收件人、主题并附加生成的PDF:
Future<void> sendEmailWithAttachment(String filePath) async { final Email email = Email( subject: '屏幕截图PDF', recipients: ['目标邮箱@xxx.com'], // 替换为实际收件人邮箱 attachmentPaths: [filePath], isHTML: false, ); try { await FlutterEmailSender.send(email); } catch (error) { // 可添加弹窗提示用户发送失败 print('邮件发送失败: $error'); } }
注意事项
- 权限适配:如果选择将PDF保存到外部公共存储,Android需在
AndroidManifest.xml中添加存储权限(Android 13+需适配新的媒体权限),iOS无需额外权限。 - 自定义文件名:可根据业务需求修改
fileName格式,比如加入用户ID、订单号等标识。 - 异常处理:建议在UI层添加加载状态和错误提示,提升用户体验。
内容的提问来源于stack exchange,提问作者xXNukem KS
相关产品推荐
相关产品推荐

