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

如何利用后端数据创建含机构图片的格式化文档?

问题分析与解决方案

我从后端获取了用户名、年龄及所在地信息,需要创建特定格式的文档,要求在姓名上方插入机构图片。尝试使用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);
    }
  }

核心问题点

  1. Quill文档结构缺失:代码中未构建包含机构图片、用户信息的有效Delta内容,仅通过fromJson(jsondata)初始化文档,无法生成目标格式。
  2. 图片插入逻辑空白:Quill插入图片需要通过Delta添加{"image": 图片路径/URL}格式的内容,当前代码完全没有处理这部分逻辑。
  3. 文档保存格式错误:直接将纯文本或Delta片段写入.doc文件,这不是有效的Word文档格式,无法被办公软件识别。
  4. 权限请求逻辑缺陷:请求权限后未等待用户授权结果,可能导致后续代码执行异常。

修复后的完整实现代码

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");
  }
}

关键说明

  1. 图片处理:如果机构图片是网络资源,需要先下载到本地后再传入Delta;本地图片需确保在pubspec.yaml中声明资源路径。
  2. 依赖配置:需在pubspec.yaml中添加以下依赖:
    dependencies:
      quill: ^latest_version
      permission_handler: ^latest_version
      quill_html_converter: ^latest_version
      docx: ^latest_version
    
  3. 格式有效性:通过HTML转DOCX的方式生成的文档可直接被Word等软件打开,避免了纯文本写入.doc的无效格式问题。

内容的提问来源于stack exchange,提问作者Senthur Kumaran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:55:22