Showing
3 changed files
with
88 additions
and
2 deletions
| @@ -15,13 +15,16 @@ | @@ -15,13 +15,16 @@ | ||
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | import 'dart:async'; | 17 | import 'dart:async'; |
| 18 | +import 'dart:typed_data'; | ||
| 18 | import 'dart:ui' as ui; | 19 | import 'dart:ui' as ui; |
| 19 | 20 | ||
| 20 | import 'package:flutter/material.dart'; | 21 | import 'package:flutter/material.dart'; |
| 21 | import 'package:flutter/rendering.dart'; | 22 | import 'package:flutter/rendering.dart'; |
| 22 | import 'package:pdf/pdf.dart'; | 23 | import 'package:pdf/pdf.dart'; |
| 24 | +import 'package:pdf/widgets.dart' as pw; | ||
| 23 | 25 | ||
| 24 | /// Wrap a Flutter Widget identified by a GlobalKey to a PdfImage. | 26 | /// Wrap a Flutter Widget identified by a GlobalKey to a PdfImage. |
| 27 | +@Deprecated('Use WidgetWraper.fromKey() instead') | ||
| 25 | Future<PdfImage> wrapWidget( | 28 | Future<PdfImage> wrapWidget( |
| 26 | PdfDocument document, { | 29 | PdfDocument document, { |
| 27 | @required GlobalKey key, | 30 | @required GlobalKey key, |
| @@ -40,3 +43,85 @@ Future<PdfImage> wrapWidget( | @@ -40,3 +43,85 @@ Future<PdfImage> wrapWidget( | ||
| 40 | return PdfImage(document, | 43 | return PdfImage(document, |
| 41 | image: imageData, width: image.width, height: image.height); | 44 | image: imageData, width: image.width, height: image.height); |
| 42 | } | 45 | } |
| 46 | + | ||
| 47 | +/// ImageProvider that draws a Flutter Widget on a PDF document | ||
| 48 | +class WidgetWraper extends pw.ImageProvider { | ||
| 49 | + WidgetWraper._( | ||
| 50 | + this.bytes, | ||
| 51 | + int width, | ||
| 52 | + int height, | ||
| 53 | + PdfImageOrientation orientation, | ||
| 54 | + double dpi, | ||
| 55 | + ) : super(width, height, orientation, dpi); | ||
| 56 | + | ||
| 57 | + /// Wrap a Flutter Widget identified by a GlobalKey to an ImageProvider. | ||
| 58 | + /// | ||
| 59 | + /// Use it with a RepaintBoundary: | ||
| 60 | + /// ``` | ||
| 61 | + /// final rb = GlobalKey(); | ||
| 62 | + /// | ||
| 63 | + /// @override | ||
| 64 | + /// Widget build(BuildContext context) { | ||
| 65 | + /// return RepaintBoundary( | ||
| 66 | + /// key: rb, | ||
| 67 | + /// child: FlutterLogo() | ||
| 68 | + /// ); | ||
| 69 | + /// } | ||
| 70 | + /// | ||
| 71 | + /// Future<Uint8List> _generatePdf(PdfPageFormat format) async { | ||
| 72 | + /// final pdf = pw.Document(); | ||
| 73 | + /// | ||
| 74 | + /// final image = await WidgetWraper.fromKey(key: rb); | ||
| 75 | + /// | ||
| 76 | + /// pdf.addPage( | ||
| 77 | + /// pw.Page( | ||
| 78 | + /// build: (context) { | ||
| 79 | + /// return pw.Center( | ||
| 80 | + /// child: pw.Image(image), | ||
| 81 | + /// ); | ||
| 82 | + /// }, | ||
| 83 | + /// ), | ||
| 84 | + /// ); | ||
| 85 | + /// | ||
| 86 | + /// return pdf.save(); | ||
| 87 | + /// } | ||
| 88 | + /// ``` | ||
| 89 | + static Future<WidgetWraper> fromKey({ | ||
| 90 | + @required GlobalKey key, | ||
| 91 | + int width, | ||
| 92 | + int height, | ||
| 93 | + double pixelRatio = 1.0, | ||
| 94 | + PdfImageOrientation orientation, | ||
| 95 | + double dpi, | ||
| 96 | + }) async { | ||
| 97 | + assert(key != null); | ||
| 98 | + assert(pixelRatio != null && pixelRatio > 0); | ||
| 99 | + | ||
| 100 | + final RenderRepaintBoundary wrappedWidget = | ||
| 101 | + key.currentContext.findRenderObject(); | ||
| 102 | + final image = await wrappedWidget.toImage(pixelRatio: pixelRatio); | ||
| 103 | + final byteData = await image.toByteData(format: ui.ImageByteFormat.rawRgba); | ||
| 104 | + final imageData = byteData.buffer.asUint8List(); | ||
| 105 | + return WidgetWraper._( | ||
| 106 | + imageData, | ||
| 107 | + image.width, | ||
| 108 | + image.height, | ||
| 109 | + orientation ?? PdfImageOrientation.topLeft, | ||
| 110 | + dpi, | ||
| 111 | + ); | ||
| 112 | + } | ||
| 113 | + | ||
| 114 | + /// The image data | ||
| 115 | + final Uint8List bytes; | ||
| 116 | + | ||
| 117 | + @override | ||
| 118 | + PdfImage buildImage(pw.Context context, {int width, int height}) { | ||
| 119 | + return PdfImage( | ||
| 120 | + context.document, | ||
| 121 | + image: bytes, | ||
| 122 | + width: width ?? this.width, | ||
| 123 | + height: height ?? this.height, | ||
| 124 | + orientation: orientation, | ||
| 125 | + ); | ||
| 126 | + } | ||
| 127 | +} |
| @@ -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: 4.0.1 | 7 | +version: 4.1.0 |
| 8 | 8 | ||
| 9 | environment: | 9 | environment: |
| 10 | sdk: ">=2.3.0 <3.0.0" | 10 | sdk: ">=2.3.0 <3.0.0" |
-
Please register or login to post a comment