Слишком медленное создание PDF-файла Flutter с изображением

Я работаю над приложением-генератором PDF-файлов во флаттере, но когда я хочу добавить изображение в PDF-файл, это занимает слишком много времени, также я хотел знать, как можно добавить несколько изображений.

Я использую 3 библиотеки, средство выбора изображений - pdf - печать

вот мой код:

Future getImage() async {
  var image = await ImagePicker.pickImage(source: ImageSource.gallery);
  final tempDir = await getTemporaryDirectory();
  final path = tempDir.path;
  int rand = new Math.Random().nextInt(10000000);
  imge.Image imagee = imge.decodeImage(image.readAsBytesSync());
  imge.Image smallerImage = imge.copyResize(imagee, 500);
  setState(() {
   var  _image =  new   File('$path/img_$rand.jpg')..writeAsBytesSync(imge.encodeJpg(smallerImage, quality: 85));

   _sharePdf(_image);
  });


}



 PDFDocument _generateDocument(File _image)  {
    final pdf = new PDFDocument(deflate: zlib.encode);
    final page = new PDFPage(pdf, pageFormat: PDFPageFormat.LETTER);
    final g = page.getGraphics();
    final font = new PDFFont(pdf);
    final top = page.pageFormat.height;

    print(top);

    imge.Image img = imge.decodeImage(_image.readAsBytesSync());


    PDFImage image = new PDFImage(
       pdf,
       image: img.data.buffer.asUint8List(),
       width: img.width,
       height: img.height);

   g.drawImage(image, 100.0, top - 150.0, 80.0, 100.0);

    return pdf;
  }

  void _sharePdf(File _image) {
    print("Share ...");
    final pdf = _generateDocument(_image);

    // Calculate the widget center for iPad sharing popup position
    final RenderBox referenceBox =
    shareWidget.currentContext.findRenderObject();
    final topLeft =
    referenceBox.localToGlobal(referenceBox.paintBounds.topLeft);
    final bottomRight =
    referenceBox.localToGlobal(referenceBox.paintBounds.bottomRight);
    final bounds = new Rect.fromPoints(topLeft, bottomRight);

    Printing.sharePdf(document: pdf, bounds: bounds);
  }

Затем я вызываю функцию getImage ().

После того, как я выберу изображение, пройдет 2-3 минуты, и все застынет, и вы сможете поделиться PDF-файлом!


person Juan Jose Rodrigo    schedule 06.09.2018    source источник
comment
Вы пытались отладить свой код с помощью точек останова, чтобы узнать, что занимает так много времени?   -  person boformer    schedule 07.09.2018
comment
да, это генерация изображения в pdf, потому что выбор изображения происходит быстро   -  person Juan Jose Rodrigo    schedule 07.09.2018
comment
Эта часть? writeAsBytesSync(imge.encodeJpg(smallerImage, quality: 85))   -  person boformer    schedule 07.09.2018
comment
когда он вызывает _sharePdf (_image); зависает, сжатие и получение изображения в порядке   -  person Juan Jose Rodrigo    schedule 07.09.2018
comment
Можете ли вы предоставить полное, но минимальное воспроизведение этого?   -  person Dan Field    schedule 24.09.2018


Ответы (1)


flutter_html_to_pdf плагин для iOS и Android для создания PDF-файлов из HTML.

использовать:

https://pub.dev/packages/flutter_html_to_pdf

вместо того:

https://pub.dev/packages/pdf

Сначала добавьте flutter_html_to_pdf в качестве зависимости в ваш файл pubspec.yaml.

 dependencies:
 flutter_html_to_pdf: ^0.5.2

Теперь в вашем коде Dart вы можете использовать:

 import 'package:flutter_html_to_pdf/flutter_html_to_pdf.dart';

Использование #

 var htmlContent =
 """
 <!DOCTYPE html>
 <html>
 <head>
   <style>
   table, th, td {
   border: 1px solid black;
     border-collapse: collapse;
   }
   th, td, p {
     padding: 5px;
     text-align: left;
   }
   </style>
 </head>
   <body>
     <h2>PDF Generated with flutter_html_to_pdf plugin</h2>
     <table style="width:100%">
       <caption>Sample HTML Table</caption>
       <tr>
         <th>Month</th>
         <th>Savings</th>
       </tr>
       <tr>
        <td>January</td>
         <td>100</td>
       </tr>
       <tr>
         <td>February</td>
         <td>50</td>
       </tr>
     </table>
     <p>Image loaded from web</p>
     <img src="https://i.imgur.com/wxaJsXF.png" alt="web-img">
   </body>
 </html>
 """;

 var targetPath = "/your/sample/path";
 var targetFileName = "example_pdf_file"

 var generatedPdfFile = await FlutterHtmlToPdf.convertFromHtmlContent(
     htmlContent, targetPath, targetFileName);

Вы также можете передать объект File с содержимым HTML внутри в качестве параметра

 var file = File("/sample_path/example.html");
 var generatedPdfFile = await FlutterHtmlToPdf.convertFromHtmlFile(
     file, targetPath, targetFileName);

или даже просто путь к этому файлу

 var filePath = "/sample_path/example.html";
 var generatedPdfFile = await FlutterHtmlToPdf.convertFromHtmlFilePath(
     filePath, targetPath, targetFileName);

Изображения Если вы хотите добавить локальное изображение с устройства в свой HTML-код, вам необходимо передать путь к изображению как значение src.

 <img src="file:///storage/example/your_sample_image.png" alt="web-img">

или если вы хотите использовать объект файла изображения

 <img src="${imageFile.path}" alt="web-img">

А для нескольких изображений вы можете добавить несколько тегов, например:

 <img src="your source" alt="your alternative">
 <img src="your source" alt="your alternative">
 <img src="your source" alt="your alternative">
 <img src="your source" alt="your alternative">
 <img src="your source" alt="your alternative">
person Abdul Rauf    schedule 13.08.2020