如何利用后端数据创建含机构图片的格式化文档?
问题分析与解决方案
我从后端获取了用户名、年龄及所在地信息,需要创建特定格式的文档,要求在姓名上方插入机构图片。尝试使用Quill Package实现但未能成功创建文档,以下是我的代码:
Future<void> downloadingOpdCard({required int index}) async { quill.QuillController controller = quill.QuillController( document: quill.Document.fromJson(jsondata), selection: const TextSelection.collapsed(offset: 0)); Directory dir = Directory("/storage/emulated/0/MedBook"); PermissionStatus permission = await Permission.storage.status; try { if (permission.isDenied) { Permission.storage.request(); } if (await permission.isGranted) { if (!dir.existsSync()) { dir.createSync(recursive: true); File file = File("${dir.path}/sample.doc"); print(file.absolute); if (file.existsSync()) { file.deleteSync(); file.writeAsString(controller.document.getPlainText(0, 300)); } else { file.writeAsString(controller.document.getPlainText(0, 300)); } } else { File file = File("${dir.path}/sample.doc"); print(file.absolute); file.writeAsString( controller.document.toDelta().first.data.toString()); } } else { print("Permission Denied"); } } catch (e) { print(e); } }
核心问题点
- Quill文档结构缺失:代码中未构建包含机构图片、用户信息的有效Delta内容,仅通过
fromJson(jsondata)初始化文档,无法生成目标格式。 - 图片插入逻辑空白:Quill插入图片需要通过Delta添加
{"image": 图片路径/URL}格式的内容,当前代码完全没有处理这部分逻辑。 - 文档保存格式错误:直接将纯文本或Delta片段写入
.doc文件,这不是有效的Word文档格式,无法被办公软件识别。 - 权限请求逻辑缺陷:请求权限后未等待用户授权结果,可能导致后续代码执行异常。
修复后的完整实现代码
import 'package:quill/quill.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:quill_html_converter/quill_html_converter.dart'; import 'package:docx/docx.dart'; // 假设的用户数据模型 class UserData { final String name; final int age; final String location; UserData({required this.name, required this.age, required this.location}); } Future<void> downloadingOpdCard({required int index, required UserData userData}) async { // 1. 构建包含机构图片和用户信息的Quill Delta文档 String institutionImagePath = "assets/institution_logo.png"; // 替换为你的图片本地路径/网络URL quill.Delta delta = quill.Delta() // 插入机构图片 ..insert({"image": institutionImagePath}) ..insert("\n\n") // 图片与姓名间换行分隔 // 插入加粗的姓名标签和内容 ..insert("姓名: ", quill.Attribute.bold.value) ..insert("${userData.name}\n") // 插入年龄信息 ..insert("年龄: ", quill.Attribute.bold.value) ..insert("${userData.age}\n") // 插入所在地信息 ..insert("所在地: ", quill.Attribute.bold.value) ..insert("${userData.location}\n"); // 初始化Quill控制器 quill.QuillController controller = quill.QuillController( document: quill.Document.fromDelta(delta), selection: const TextSelection.collapsed(offset: 0), ); // 2. 处理存储权限 PermissionStatus permission = await Permission.storage.status; if (permission.isDenied) { PermissionStatus status = await Permission.storage.request(); if (!status.isGranted) { print("权限被拒绝"); return; } } // 3. 创建存储目录 Directory dir = Directory("/storage/emulated/0/MedBook"); if (!dir.existsSync()) { dir.createSync(recursive: true); } // 4. 转换为HTML并生成可识别的DOCX文档 try { String html = quillHtmlConverter.convertDeltaToHtml(controller.document.toDelta()); final doc = Document(); doc.addParagraph(Paragraph(children: [Html(html)])); File file = File("${dir.path}/opd_card_$index.docx"); if (file.existsSync()) { file.deleteSync(); } await doc.save(file); print("文档已保存至: ${file.absolute}"); } catch (e) { print("保存失败: $e"); } }
关键说明
- 图片处理:如果机构图片是网络资源,需要先下载到本地后再传入Delta;本地图片需确保在
pubspec.yaml中声明资源路径。 - 依赖配置:需在
pubspec.yaml中添加以下依赖:dependencies: quill: ^latest_version permission_handler: ^latest_version quill_html_converter: ^latest_version docx: ^latest_version - 格式有效性:通过HTML转DOCX的方式生成的文档可直接被Word等软件打开,避免了纯文本写入
.doc的无效格式问题。
内容的提问来源于stack exchange,提问作者Senthur Kumaran
相关产品推荐
相关产品推荐

