Marco Papula
Committed by David PHAM-VAN

Create wrapWidget helper

1 # Changelog 1 # Changelog
2 2
  3 +## 3.3.0
  4 +
  5 +- Add wrapWidget helper
  6 +
3 ## 3.2.1 7 ## 3.2.1
4 8
5 - Add meta and image dependencies 9 - Add meta and image dependencies
1 import 'dart:async'; 1 import 'dart:async';
2 import 'dart:io'; 2 import 'dart:io';
3 -import 'dart:typed_data';  
4 -import 'dart:ui' as ui;  
5 3
6 import 'package:flutter/foundation.dart'; 4 import 'package:flutter/foundation.dart';
7 import 'package:flutter/material.dart'; 5 import 'package:flutter/material.dart';
@@ -9,7 +7,6 @@ import 'package:flutter/rendering.dart'; @@ -9,7 +7,6 @@ import 'package:flutter/rendering.dart';
9 import 'package:flutter/services.dart'; 7 import 'package:flutter/services.dart';
10 import 'package:markdown/markdown.dart' as markdown; 8 import 'package:markdown/markdown.dart' as markdown;
11 import 'package:path_provider/path_provider.dart'; 9 import 'package:path_provider/path_provider.dart';
12 -  
13 import 'package:pdf/pdf.dart'; 10 import 'package:pdf/pdf.dart';
14 import 'package:pdf/widgets.dart' as pw; 11 import 'package:pdf/widgets.dart' as pw;
15 import 'package:printing/printing.dart'; 12 import 'package:printing/printing.dart';
@@ -156,21 +153,17 @@ class MyAppState extends State<MyApp> { @@ -156,21 +153,17 @@ class MyAppState extends State<MyApp> {
156 } 153 }
157 154
158 Future<void> _printScreen() async { 155 Future<void> _printScreen() async {
159 - final RenderRepaintBoundary boundary =  
160 - previewContainer.currentContext.findRenderObject();  
161 - final ui.Image im = await boundary.toImage();  
162 - final ByteData bytes =  
163 - await im.toByteData(format: ui.ImageByteFormat.rawRgba);  
164 - print('Print Screen ${im.width}x${im.height} ...');  
165 -  
166 final bool result = 156 final bool result =
167 - await Printing.layoutPdf(onLayout: (PdfPageFormat format) { 157 + await Printing.layoutPdf(onLayout: (PdfPageFormat format) async {
168 final pw.Document document = pw.Document(); 158 final pw.Document document = pw.Document();
169 159
170 - final PdfImage image = PdfImage(document.document,  
171 - image: bytes.buffer.asUint8List(),  
172 - width: im.width,  
173 - height: im.height); 160 + final PdfImage image = await wrapWidget(
  161 + document.document,
  162 + key: previewContainer,
  163 + pixelRatio: 2.0,
  164 + );
  165 +
  166 + print('Print Screen ${image.width}x${image.height}...');
174 167
175 document.addPage(pw.Page( 168 document.addPage(pw.Page(
176 pageFormat: format, 169 pageFormat: format,
@@ -20,3 +20,4 @@ export 'src/printer.dart'; @@ -20,3 +20,4 @@ export 'src/printer.dart';
20 export 'src/printing.dart'; 20 export 'src/printing.dart';
21 export 'src/printing_info.dart'; 21 export 'src/printing_info.dart';
22 export 'src/raster.dart'; 22 export 'src/raster.dart';
  23 +export 'src/widget_wrapper.dart';
  1 +/*
  2 + * Copyright (C) 2017, David PHAM-VAN <dev.nfet.net@gmail.com>
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +
  17 +import 'dart:async';
  18 +import 'dart:typed_data';
  19 +import 'dart:ui' as ui;
  20 +
  21 +import 'package:flutter/material.dart';
  22 +import 'package:flutter/rendering.dart';
  23 +import 'package:pdf/pdf.dart';
  24 +
  25 +/// Wrap a Flutter Widget identified by a GlobalKey to a PdfImage.
  26 +Future<PdfImage> wrapWidget(
  27 + PdfDocument document, {
  28 + @required GlobalKey key,
  29 + int width,
  30 + int height,
  31 + double pixelRatio = 1.0,
  32 +}) async {
  33 + assert(key != null);
  34 + assert(pixelRatio != null && pixelRatio > 0);
  35 +
  36 + final RenderRepaintBoundary wrappedWidget =
  37 + key.currentContext.findRenderObject();
  38 + ui.Image image = await wrappedWidget.toImage(pixelRatio: pixelRatio);
  39 +
  40 + image = await _resize(image, width, height);
  41 +
  42 + final ByteData byteData =
  43 + await image.toByteData(format: ui.ImageByteFormat.rawRgba);
  44 + final Uint8List imageData = byteData.buffer.asUint8List();
  45 + return PdfImage(document,
  46 + image: imageData, width: image.width, height: image.height);
  47 +}
  48 +
  49 +Future<ui.Image> _resize(
  50 + ui.Image image,
  51 + int width,
  52 + int height,
  53 +) async {
  54 + if (width == null && height == null) {
  55 + return image;
  56 + }
  57 +
  58 + width ??= (height / image.height * image.width).toInt();
  59 + height ??= (width / image.width * image.height).toInt();
  60 +
  61 + final Completer<ui.Image> ptr = Completer<ui.Image>();
  62 + final Uint8List data =
  63 + (await image.toByteData(format: ui.ImageByteFormat.rawRgba))
  64 + .buffer
  65 + .asUint8List();
  66 + ui.decodeImageFromPixels(
  67 + data,
  68 + image.width,
  69 + image.height,
  70 + ui.PixelFormat.rgba8888,
  71 + (ui.Image result) {
  72 + ptr.complete(result);
  73 + },
  74 + targetWidth: width,
  75 + targetHeight: height,
  76 + );
  77 + return ptr.future;
  78 +}
@@ -4,7 +4,7 @@ description: Plugin that allows Flutter apps to generate and print documents to @@ -4,7 +4,7 @@ description: Plugin that allows Flutter apps to generate and print documents to
4 homepage: https://github.com/DavBfr/dart_pdf/tree/master/printing 4 homepage: https://github.com/DavBfr/dart_pdf/tree/master/printing
5 repository: https://github.com/DavBfr/dart_pdf 5 repository: https://github.com/DavBfr/dart_pdf
6 issue_tracker: https://github.com/DavBfr/dart_pdf/issues 6 issue_tracker: https://github.com/DavBfr/dart_pdf/issues
7 -version: 3.2.1 7 +version: 3.3.0
8 8
9 environment: 9 environment:
10 sdk: ">=2.3.0 <3.0.0" 10 sdk: ">=2.3.0 <3.0.0"