Image 颤振pdf多幅图像

Image 颤振pdf多幅图像,image,flutter,pdf,Image,Flutter,Pdf,我正在尝试将多个图像(从资产或缓存)加载到pdf中,但它不起作用。 没有错误,pdf已创建,但不知何故已损坏,不想打开。 如果只有一个图像,或者如果所有图像都是相同的图像,则所有内容都是100%。 我做错了什么 import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'dart:io'; import 'package:path_provider/path_provider.da

我正在尝试将多个图像(从资产或缓存)加载到pdf中,但它不起作用。 没有错误,pdf已创建,但不知何故已损坏,不想打开。 如果只有一个图像,或者如果所有图像都是相同的图像,则所有内容都是100%。 我做错了什么

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart' as pw;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            appBar: AppBar(backgroundColor: Colors.red, title: Text('Images')),
            body: Center(child: HomeScreen())));
  }
}

class HomeScreen extends StatefulWidget {
  HomeScreenState createState() => HomeScreenState();
}

class HomeScreenState extends State<HomeScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Center(
      child: ListView(
        children: <Widget>[
          RaisedButton(
            color: Colors.red,
            onPressed: () async {
              writeOnPdf();
              await savePdf();
            },
            child: Text('Create Pdf'),
          ),
        ],
      ),
    ));
  }
}

final pdf = pw.Document();

writeOnPdf() async {
  var assetImage = PdfImage.file(
    pdf.document,
    bytes: (await rootBundle.load('assets/aa.png')).buffer.asUint8List(),
  );

  var otherImage = PdfImage.file(
    pdf.document,
    bytes: (await rootBundle.load('assets/out.png')).buffer.asUint8List(),
  );

  pdf.addPage(pw.MultiPage(
      pageFormat: PdfPageFormat.a4,
      margin: pw.EdgeInsets.all(32),
      build: (pw.Context context) {
        return <pw.Widget>[
          pw.Column(
              crossAxisAlignment: pw.CrossAxisAlignment.center,
              mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
              children: <pw.Widget>[
                pw.ClipRect(
                  child: pw.Container(
                    width: 550,
                    height: 250,
                    child: pw.Image(assetImage),
                  ),
                ),
              ]),
          pw.ClipRect(
            child: pw.Container(
              width: 100,
              height: 100,
              child: pw.Image(otherImage),
            ),
          )
        ];
      }));
}

final bool isHTML = false;

Future savePdf() async {
  Directory tempDir = await getTemporaryDirectory();
  String tempPath = tempDir.path;
  File file = File('$tempPath/1234.pdf');
  file.writeAsBytesSync(pdf.save());
  print(tempDir.listSync());
}
导入“包装:颤振/材料.省道”;
导入“包:flifter/services.dart”;
导入“dart:io”;
导入“package:path_provider/path_provider.dart”;
输入‘package:pdf/pdf.dart’;
导入“package:pdf/widgets.dart”作为pw;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:脚手架(
appBar:appBar(背景色:Colors.red,标题:Text('Images')),
主体:中心(子对象:主屏幕());
}
}
类主屏幕扩展StatefulWidget{
HomeScreenState createState()=>HomeScreenState();
}
类HomeScreenState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:中(
子:ListView(
儿童:[
升起的按钮(
颜色:颜色,红色,
onPressed:()异步{
writeOnPdf();
等待savePdf();
},
子项:文本(“创建Pdf”),
),
],
),
));
}
}
最终pdf=pw.Document();
writeOnPdf()异步{
var assetImage=PdfImage.file(
pdf.document,
字节:(等待rootBundle.load('assets/aa.png')).buffer.asUint8List(),
);
var otherImage=PdfImage.file(
pdf.document,
字节:(等待rootBundle.load('assets/out.png')).buffer.asUint8List(),
);
pdf.addPage(pw.MultiPage(
页面格式:PdfPageFormat.a4,
裕度:所有边缘集(32),
构建:(pw.Context){
返回[
pw.柱(
crossAxisAlignment:pw.crossAxisAlignment.center,
mainAxisAlignment:pw.mainAxisAlignment.spaceBetween,
儿童:[
克利普雷克特(
子:pw.容器(
宽度:550,
身高:250,
子项:pw.图像(assetImage),
),
),
]),
克利普雷克特(
子:pw.容器(
宽度:100,
身高:100,
子:pw.Image(其他图像),
),
)
];
}));
}
最终bool isHTML=假;
Future savePdf()异步{
目录tempDir=await getTemporaryDirectory();
字符串tempPath=tempDir.path;
File File=File(“$tempPath/1234.pdf”);
writeAsBytesSync(pdf.save());
打印(tempDir.listSync());
}
如果我可以从资产中加载一个图像,从缓存中加载一个图像,这将是非常理想的。但目前一切都不起作用。 任何建议都将不胜感激。

DavBfr给出了答案。“这是async/await的问题。”

多幅图像#425]

              RaisedButton(
            color: Colors.red,
            onPressed: () async {
              final pdf = await writeOnPdf();
              await savePdf(pdf);
            },
            child: const Text('Create Pdf'),
          ),