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

Flutter Syncfusion PDF添加图片打包后失效问题求助

Flutter Syncfusion PDF 添加图片后真机/打包程序失效(仅模拟器正常)

问题现象

使用syncfusion_flutter_pdf: 24.1.43生成PDF时,添加图片的代码在IDE模拟器中可正常运行,但打包成Windows程序、iOS/Android真机运行时,点击生成PDF无任何反应;移除图片相关代码后,打包程序完全正常,确认问题出在图片写入环节。

最初使用的示例代码(仅修改路径和位置参数):

final Uint8List imageData = File('assets/images/seallogol.png').readAsBytesSync();
//Load the image using PdfBitmap.
final PdfBitmap image = PdfBitmap(imageData);
//Draw the image to the PDF page.
document.pages
    .add()
    .graphics
    .drawImage(image, const Rect.fromLTWH(225, 0, 60, 60));

后续改为在已有页面绘制图片的代码:

final Uint8List imageData = File('assets/images/seallogo.png').readAsBytesSync();
final PdfBitmap image = PdfBitmap(imageData);
page.graphics.drawImage(image, const Rect.fromLTWH(225, 0, 60, 60));

两种写法均仅在模拟器中生效,真机/打包程序中失效。

问题原因

直接通过File读取assets路径的方式仅在调试模拟器环境下可行,因为模拟器会将assets映射为可直接访问的文件路径;但在真机或打包后的程序中,assets文件会被打包到应用资源包内,无法通过普通文件路径读取,导致图片加载失败,进而阻塞PDF生成流程。

解决方案

使用Flutter官方提供的rootBundle加载assets资源,具体步骤如下:

  1. 确保pubspec.yaml中已正确配置assets路径(路径和文件名需完全匹配):
flutter:
  assets:
    - assets/images/seallogo.png
  1. 修改图片加载代码为异步加载方式:
import 'package:flutter/services.dart';

// 确保所在函数为async函数
Future<void> generatePdf() async {
  // ... 初始化PdfDocument、page等代码 ...

  // 加载assets中的图片
  final ByteData byteData = await rootBundle.load('assets/images/seallogo.png');
  final Uint8List imageData = byteData.buffer.asUint8List();
  final PdfBitmap image = PdfBitmap(imageData);
  
  // 绘制图片到PDF页面
  page.graphics.drawImage(image, const Rect.fromLTWH(225, 0, 60, 60));

  // ... 保存或导出PDF的代码 ...
}

注意事项

  • rootBundle.load是异步方法,需确保调用它的函数标记为async,并使用await处理结果
  • 路径和文件名区分大小写,尤其在iOS、macOS等系统中需严格匹配
  • 若图片体积较大,建议在异步任务中加载,避免阻塞UI线程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 05:15:14