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
相关产品推荐
相关产品推荐

