You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Flutter pdf包生成PDF遇FileSystemException错误求助

解决Flutter PDF生成时的FileSystemException(只读文件系统)错误

错误原因

你直接使用File('example.pdf')尝试在应用根路径写入文件,但Flutter应用在移动端(iOS/Android)没有根目录的写入权限,系统会返回只读文件系统错误(errno=30)。

解决步骤

1. 添加path_provider依赖

在pubspec.yaml的dependencies下添加:

dependencies:
  flutter:
    sdk: flutter
  pdf: ^3.10.1 # 确保你的pdf包版本为最新稳定版
  path_provider: ^2.1.1

执行flutter pub get完成依赖安装。

2. 修改代码获取可写目录

使用path_provider获取应用专属的可写文档目录,再在该目录下创建PDF文件:

import 'dart:io';
import 'package:pdf/widgets.dart' as pw;
import 'package:path_provider/path_provider.dart';

Future<void> main() async {
  final pdf = pw.Document();

  pdf.addPage(
    pw.Page(
      build: (pw.Context context) => pw.Center(
        child: pw.Text('Hello World!'),
      ),
    ),
  );

  // 获取应用专属的可写文档目录
  final directory = await getApplicationDocumentsDirectory();
  final file = File('${directory.path}/example.pdf');
  
  await file.writeAsBytes(await pdf.save());
  print('PDF已保存到: ${file.path}');
}

3. 平台适配补充

  • Web端:不能直接使用dart:io的File类,需改用浏览器下载API:
    import 'dart:html' as html;
    
    // 替换写入文件的代码
    final bytes = await pdf.save();
    final blob = html.Blob([bytes], 'application/pdf');
    final url = html.Url.createObjectUrlFromBlob(blob);
    html.AnchorElement(href: url)
      ..setAttribute('download', 'example.pdf')
      ..click();
    html.Url.revokeObjectUrl(url);
    
  • 移动端可通过打印的路径,在设备文件管理器的应用专属目录下找到生成的PDF文件。

内容的提问来源于stack exchange,提问作者harsha voleti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:55:23