David PHAM-VAN

Fix raster pages on Android and Web

@@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
3 ## 3.7.2 3 ## 3.7.2
4 4
5 - Fix Printing on WEB 5 - Fix Printing on WEB
  6 +- Fix raster pages on Android and Web
6 7
7 ## 3.7.1 8 ## 3.7.1
8 9
@@ -7,6 +7,7 @@ import android.print.PrintAttributes; @@ -7,6 +7,7 @@ import android.print.PrintAttributes;
7 import androidx.annotation.NonNull; 7 import androidx.annotation.NonNull;
8 import androidx.annotation.RequiresApi; 8 import androidx.annotation.RequiresApi;
9 9
  10 +import java.util.ArrayList;
10 import java.util.HashMap; 11 import java.util.HashMap;
11 12
12 import io.flutter.plugin.common.MethodCall; 13 import io.flutter.plugin.common.MethodCall;
@@ -89,7 +90,7 @@ public class PrintingHandler implements MethodChannel.MethodCallHandler { @@ -89,7 +90,7 @@ public class PrintingHandler implements MethodChannel.MethodCallHandler {
89 } 90 }
90 case "rasterPdf": { 91 case "rasterPdf": {
91 final byte[] document = call.argument("doc"); 92 final byte[] document = call.argument("doc");
92 - final int[] pages = call.argument("pages"); 93 + final ArrayList<Integer> pages = call.argument("pages");
93 Double scale = call.argument("scale"); 94 Double scale = call.argument("scale");
94 final PrintingJob printJob = 95 final PrintingJob printJob =
95 new PrintingJob(activity, this, (int) call.argument("job")); 96 new PrintingJob(activity, this, (int) call.argument("job"));
@@ -53,6 +53,7 @@ import java.io.FileOutputStream; @@ -53,6 +53,7 @@ import java.io.FileOutputStream;
53 import java.io.IOException; 53 import java.io.IOException;
54 import java.io.OutputStream; 54 import java.io.OutputStream;
55 import java.nio.ByteBuffer; 55 import java.nio.ByteBuffer;
  56 +import java.util.ArrayList;
56 import java.util.HashMap; 57 import java.util.HashMap;
57 import java.util.List; 58 import java.util.List;
58 59
@@ -302,7 +303,7 @@ public class PrintingJob extends PrintDocumentAdapter { @@ -302,7 +303,7 @@ public class PrintingJob extends PrintDocumentAdapter {
302 callback.onLayoutFinished(info, true); 303 callback.onLayoutFinished(info, true);
303 } 304 }
304 305
305 - void rasterPdf(final byte[] data, final int[] pages, final Double scale) { 306 + void rasterPdf(final byte[] data, final ArrayList<Integer> pages, final Double scale) {
306 if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) { 307 if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) {
307 Log.e("PDF", "PDF Raster available since Android 5.0 Lollipop (API 21)"); 308 Log.e("PDF", "PDF Raster available since Android 5.0 Lollipop (API 21)");
308 printing.onPageRasterEnd(this); 309 printing.onPageRasterEnd(this);
@@ -327,9 +328,9 @@ public class PrintingJob extends PrintDocumentAdapter { @@ -327,9 +328,9 @@ public class PrintingJob extends PrintDocumentAdapter {
327 Log.e("PDF", "Unable to delete temporary file"); 328 Log.e("PDF", "Unable to delete temporary file");
328 } 329 }
329 330
330 - final int pageCount = pages != null ? pages.length : renderer.getPageCount(); 331 + final int pageCount = pages != null ? pages.size() : renderer.getPageCount();
331 for (int i = 0; i < pageCount; i++) { 332 for (int i = 0; i < pageCount; i++) {
332 - PdfRenderer.Page page = renderer.openPage(pages == null ? i : pages[i]); 333 + PdfRenderer.Page page = renderer.openPage(pages == null ? i : pages.get(i));
333 334
334 final int width = Double.valueOf(page.getWidth() * scale).intValue(); 335 final int width = Double.valueOf(page.getWidth() * scale).intValue();
335 final int height = Double.valueOf(page.getHeight() * scale).intValue(); 336 final int height = Double.valueOf(page.getHeight() * scale).intValue();
@@ -30,6 +30,7 @@ class PdfPreview extends StatefulWidget { @@ -30,6 +30,7 @@ class PdfPreview extends StatefulWidget {
30 this.pdfPreviewPageDecoration, 30 this.pdfPreviewPageDecoration,
31 this.pdfFileName, 31 this.pdfFileName,
32 this.useActions = true, 32 this.useActions = true,
  33 + this.pages,
33 }) : super(key: key); 34 }) : super(key: key);
34 35
35 /// Called when a pdf document is needed 36 /// Called when a pdf document is needed
@@ -77,6 +78,9 @@ class PdfPreview extends StatefulWidget { @@ -77,6 +78,9 @@ class PdfPreview extends StatefulWidget {
77 /// Name of the PDF when sharing. It must include the extension. 78 /// Name of the PDF when sharing. It must include the extension.
78 final String pdfFileName; 79 final String pdfFileName;
79 80
  81 + /// Pages to display. Default will display all the pages.
  82 + final List<int> pages;
  83 +
80 @override 84 @override
81 _PdfPreviewState createState() => _PdfPreviewState(); 85 _PdfPreviewState createState() => _PdfPreviewState();
82 } 86 }
@@ -123,7 +127,11 @@ class _PdfPreviewState extends State<PdfPreview> { @@ -123,7 +127,11 @@ class _PdfPreviewState extends State<PdfPreview> {
123 } 127 }
124 128
125 var pageNum = 0; 129 var pageNum = 0;
126 - await for (final PdfRaster page in Printing.raster(_doc, dpi: dpi)) { 130 + await for (final PdfRaster page in Printing.raster(
  131 + _doc,
  132 + dpi: dpi,
  133 + pages: widget.pages,
  134 + )) {
127 if (!mounted) { 135 if (!mounted) {
128 return; 136 return;
129 } 137 }
@@ -194,8 +194,9 @@ class PrintingPlugin extends PrintingPlatform { @@ -194,8 +194,9 @@ class PrintingPlugin extends PrintingPlatform {
194 final html.CanvasElement canvas = 194 final html.CanvasElement canvas =
195 js.context['document'].createElement('canvas'); 195 js.context['document'].createElement('canvas');
196 final html.CanvasRenderingContext2D context = canvas.getContext('2d'); 196 final html.CanvasRenderingContext2D context = canvas.getContext('2d');
  197 + final _pages = pages ?? Iterable<int>.generate(numPages, (index) => index);
197 198
198 - for (var i = 0; i < numPages; i++) { 199 + for (final i in _pages) {
199 final page = await promiseToFuture<PdfJsPage>(d.getPage(i + 1)); 200 final page = await promiseToFuture<PdfJsPage>(d.getPage(i + 1));
200 final viewport = page.getViewport(Settings()..scale = 1.5); 201 final viewport = page.getViewport(Settings()..scale = 1.5);
201 202