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

基于Firebase数据生成PDF并实现查看、保存与打印功能求助

解决方案

1. 添加依赖

在pubspec.yaml中加入以下依赖:

dependencies:
  flutter:
    sdk: flutter
  cloud_firestore: ^4.15.0 # 适配你的Firebase版本
  pdf: ^3.10.0
  printing: ^5.12.0
  path_provider: ^2.1.1

2. 存储Firebase数据到本地列表

修改你的StreamBuilder,将获取到的数据保存到状态变量中,方便生成PDF时直接调用:

List<YourDataModel> _dataList = []; // 替换成你的自定义数据模型类

@override
Widget build(BuildContext context) {
  return StreamBuilder<QuerySnapshot>(
    stream: FirebaseFirestore.instance.collection('your_collection').snapshots(),
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        // 将Firestore文档转成数据模型并存入列表
        _dataList = snapshot.data!.docs.map((doc) => YourDataModel.fromSnapshot(doc)).toList();
        return ListView.builder(
          itemCount: _dataList.length,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text(_dataList[index].title),
              subtitle: Text(_dataList[index].subtitle),
            );
          },
        );
      }
      return const CircularProgressIndicator();
    },
  );
}

3. 编写PDF生成函数

创建函数将列表数据渲染成PDF文档:

Future<Uint8List> _generatePdf() async {
  final pdf = Document();

  pdf.addPage(
    MultiPage(
      build: (context) => [
        Center(child: Text('数据列表', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold))),
        SizedBox(height: 20),
        // 用表格渲染列表数据,可自定义样式
        Table.fromTextArray(
          headers: ['标题', '副标题'], // 替换成你的数据字段名
          data: _dataList.map((item) => [item.title, item.subtitle]).toList(),
          border: TableBorder.all(),
          headerStyle: TextStyle(fontWeight: FontWeight.bold),
          cellAlignment: Alignment.centerLeft,
        ),
      ],
    ),
  );

  return pdf.save();
}

4. 实现预览、保存与打印功能

添加按钮触发PDF操作,结合printing包完成所有需求:

ElevatedButton(
  onPressed: () async {
    final pdfBytes = await _generatePdf();
    
    // 弹窗预览PDF,预览界面自带保存、打印按钮
    await Printing.layoutPdf(
      onLayout: (format) async => pdfBytes,
    );

    // 手动保存PDF到本地(可单独拆成按钮或整合到弹窗)
    final dir = await getApplicationDocumentsDirectory();
    final file = File('${dir.path}/data_list.pdf');
    await file.writeAsBytes(pdfBytes);

    // 直接触发打印(可选,无需预览)
    // await Printing.printPdf(bytes: pdfBytes);
  },
  child: Text('生成PDF'),
)

注意事项

  • 确保你的YourDataModel类正确实现fromSnapshot方法,能解析Firestore文档数据
  • 若数据量大,MultiPage会自动分页,也可自定义分页逻辑
  • 若要保存到外部存储,需使用getExternalStorageDirectory并申请存储权限

内容的提问来源于stack exchange,提问作者EBENEZER OCANSEY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 05:17:17