如何使用dart_pdf在Flutter中将Assets图像和图标转换为PdfImage

时间:2019-07-05 05:15:34

标签: pdf flutter dart pdf-generation flutter-layout

Used Library: dart_pdf搜索后,我在GITHUB中发现了相同的问题,但无法解决。我尝试了此操作,但出现了模糊的图像。请帮忙!

  ByteData data = await rootBundle.load('assets/test.jpg');
  var codec = await instantiateImageCodec(data.buffer.asUint8List());
  var frame = await codec.getNextFrame();

  var imageBytes = await frame.image.toByteData();
  PdfImage assetImage = PdfImage(pdf.document,
      image: imageBytes.buffer.asUint8List(), width: 86, height: 80);

渲染的图像:

enter image description here

2 个答案:

答案 0 :(得分:1)

改为使用此:

final PdfImage assetImage = await pdfImageFromImageProvider(
    pdf: pdf.document, 
    image: const AssetImage('assets/test.jpg'),
);

答案 1 :(得分:0)

此功能将使用图像和自定义数据创建您的 pdf

 var pdf = new pw.Document();

 Future<pw.Document> createPDF() async {
    var assetImage = pw.MemoryImage(
      (await rootBundle.load('assets/images/delivery.png'))
          .buffer
          .asUint8List(),
    );

    pdf.addPage(pw.Page(
        pageFormat: PdfPageFormat.a4,
        build: (pw.Context context) {
          var width = MediaQuery.of(this.context).size.width;
          var height = MediaQuery.of(this.context).size.height;
          return pw.Container(
            margin: pw.EdgeInsets.only(top: height * 0.1),
            child: pw.ListView(
              children: [
                // your image here
                pw.Container(
                    height: height * 0.25, child: pw.Image(assetImage)),
              // other contents
                pw.Row(
                  mainAxisAlignment: pw.MainAxisAlignment.spaceAround,
                  children: [
                    pw.Text("order Id:"),
                    pw.Text(widget.doc['orderId']),
                  ],
                ),
              ],
            ),
          );
        }));
        
    return pdf;
  }

使用此功能保存

 Future savePdf(pw.Document pdfnew) async {
    String pdfName;
    File file;

    try {
      
      var documentDirectory = await AndroidPathProvider.downloadsPath; // for android downloads folder
    //  var localDirectory = await getApplicationDocumentsDirectory(); // for local directory
    
      setState(() {
        pdfName = "your_pdf_name";
      });
  
      file = File("$documentDirectory/$pdfName.pdf");
      await file.writeAsBytes(await pdf.save());
   
      return file.path;
    } catch (e) {
      print(e);
    }
  
  }