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

WebView转PDF失败报错FileSystemException,求解决方案及替代包

解决FileSystemException报错并实现WebView转PDF到下载文件夹

报错原因分析

你遇到的FileSystemException: Creation failed (OS Error: Not a directory, errno = 20),核心问题是代码错误地将PDF文件路径当作目录执行创建操作:

new Directory(result).create(recursive: true)

这里的result是webUriToPdf返回的PDF文件完整路径(比如/xxx/sample.pdf),并非目录路径,强行创建目录自然触发“不是目录”的报错。

代码修复方案

1. 修正核心逻辑与路径规范

移除错误的目录创建代码,同时用Path.join规范路径拼接,避免跨平台路径分隔符问题:

import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart';
import 'package:webcontent_converter2/webcontent_converter2.dart';
import 'package:open_file/open_file.dart';

IconButton(
  onPressed: () async {
    // 获取应用文档目录(要存到下载文件夹看后续步骤)
    var dir = await getApplicationDocumentsDirectory();
    // 用Path.join规范拼接文件路径
    var savedPath = path.join(dir.path, "sample.pdf");

    try {
      var result = await WebcontentConverter.webUriToPdf(
        uri: "https://xxxxxxx/xxxxxx/xxxxx",
        savedPath: savedPath,
        format: PaperFormat.a4,
        margins: PdfMargins.px(top: 35, bottom: 35, right: 35, left: 35),
      );

      if (result != null) {
        await OpenFile.open(result);
        WebcontentConverter.logger.info(result);
      } else {
        WebcontentConverter.logger.info("PDF生成失败");
      }
    } catch (e) {
      WebcontentConverter.logger.info("生成错误: ${e.toString()}");
    }
  },
  icon: Icon(Icons.save),
)

2. 保存到系统下载文件夹

如果需要将PDF保存到系统默认下载目录,需补充以下操作:

  • 添加依赖:path_provider(获取下载目录)、permission_handler(申请存储权限)
  • 代码调整:
// 先申请存储权限(Android 13+需适配READ_MEDIA系列权限,iOS需配置Info.plist权限)
var status = await Permission.storage.request();
if (status.isGranted) {
  // 获取系统下载目录
  var dir = await getDownloadsDirectory();
  if (dir != null) {
    var savedPath = path.join(dir.path, "sample.pdf");
    // 后续PDF生成逻辑同上方修正后的代码
  }
}

替代包推荐

如果webcontent_converter2无法满足需求,可以尝试这些替代方案:

  • printing:结合pdf包与webview_flutter,支持将WebView内容渲染为PDF,自定义性强,跨平台兼容好。
  • flutter_html_to_pdf:适合将WebView获取的HTML内容转换为PDF,用法简洁,支持基础样式自定义。
  • pdf:纯Flutter端的PDF生成库,可手动渲染内容,适合需要高度自定义PDF布局的场景,配合webview_flutter解析网页内容后使用。

内容的提问来源于stack exchange,提问作者Sasitha Dilshan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:06:22