【问题标题】:How to convert Assets Images & Icons to PdfImage in flutter using dart_pdf如何使用 dart_pdf 在颤振中将资产图像和图标转换为 PdfImage
【发布时间】:2019-11-15 17:23:43
【问题描述】:

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);

渲染图像:

【问题讨论】:

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


    【解决方案1】:

    改用这个:

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

    【讨论】:

    • 还有一个问题:在 pdf 文件 SVG 或 PNG 图像中,哪一个渲染得快?
    • 如果您首先将 SVG 光栅化为 Image 对象,那么它将是一个图像,与 PNG 完全一样。因此,您只有转换影响,生成的 Pdf 文件将是相同的。您也可以直接将 Jpeg 图像与 PdfImage.jpeg() 一起使用,因为不涉及转换,所以速度更快:Jpeg 文件直接嵌入在 Pdf 中。另一方面,PNG 图像将被重新压缩为原生 Pdf 位图。
    • 这个方法pdfImageFromImageProvider从哪里来的?
    • 在颤振 2 中我无法在 pdf 库中找到更多 pdfImageFromImageProvider 的蚂蚁。 github.com/DavBfr/dart_pdf/issues/31
    【解决方案2】:

    此功能将使用图像和自定义数据创建您的 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);
        }
      
      }
    

    【讨论】:

    • 这应该是对我有用的正确答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2022-01-18
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多