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资源,具体步骤如下:
- 确保
pubspec.yaml中已正确配置assets路径(路径和文件名需完全匹配):
flutter: assets: - assets/images/seallogo.png
- 修改图片加载代码为异步加载方式:
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
相关产品推荐
相关产品推荐

