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

Flutter中使用printing:^5.5.0插件如何向PDF内添加网络图片

问题根因与修复方案

现有代码存在4类核心错误,按优先级修复即可解决运行时报错:

  • 变量类型声明错误:你当前声明images为MemoryImage类型,但实际赋值为空列表,类型不匹配会直接触发运行时错误
  • 图片类型使用错误:pw.RawImage无法直接接收网络图片字节,printing库加载内存格式图片需使用pw.MemoryImage
  • 缺少网络请求异常捕获逻辑,请求失败时会直接触发崩溃
  • 未配置对应平台的网络权限,可能导致图片请求被系统拦截

修复后完整代码(previewpage.dart)

import 'package:http/http.dart' as http;
import 'package:pdf/widgets.dart' as pw;
import 'package:printing/printing.dart';

final pdf = pw.Document();

// 修正变量类型声明
List<pw.ImageProvider> images = [];

Future _getImage() async {
  try {
    for (var i = 0; i < 2; i++) {
      var response = await http.get(Uri.parse("替换为你的实际图片地址"));
      // 校验请求成功再处理图片
      if (response.statusCode == 200) {
        // 改用pw.MemoryImage加载图片字节,宽高可在渲染PDF时指定
        final image = pw.MemoryImage(response.bodyBytes);
        images.add(image);
      }
    }
    _writeOnPdf();
  } catch (e) {
    // 可自行添加错误提示逻辑
    print("图片加载失败: $e");
  }
}

// 补充PDF写入逻辑示例,可按自身需求调整
void _writeOnPdf() {
  pdf.addPage(
    pw.Page(
      build: (pw.Context context) {
        return pw.Column(
          children: images.map((img) => pw.Image(img, width: 50, height: 100)).toList(),
        );
      },
    ),
  );
}

额外配置要求

  • 安卓端需在android/app/src/main/AndroidManifest.xml中添加网络权限:
    <uses-permission android:name="android.permission.INTERNET" />
    
  • iOS端如果请求的是HTTP协议图片,需在ios/Runner/Info.plist中添加HTTP访问权限:
    <key>NSAppTransportSecurity</key>
    <dict>
      <key>NSAllowsArbitraryLoads</key>
      <true/>
    </dict>
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:48:05