Showing
5 changed files
with
39 additions
and
13 deletions
| @@ -149,7 +149,7 @@ public class PrintingPlugin extends PrintDocumentAdapter implements MethodCallHa | @@ -149,7 +149,7 @@ public class PrintingPlugin extends PrintDocumentAdapter implements MethodCallHa | ||
| 149 | } | 149 | } |
| 150 | } catch (Exception e) { | 150 | } catch (Exception e) { |
| 151 | HashMap<String, Object> args = new HashMap<>(); | 151 | HashMap<String, Object> args = new HashMap<>(); |
| 152 | - args.put("completed", printJob.isCompleted()); | 152 | + args.put("completed", printJob != null && printJob.isCompleted()); |
| 153 | args.put("error", e.getMessage()); | 153 | args.put("error", e.getMessage()); |
| 154 | channel.invokeMethod("onCompleted", args); | 154 | channel.invokeMethod("onCompleted", args); |
| 155 | } | 155 | } |
| @@ -182,6 +182,11 @@ public class PrintingPlugin extends PrintDocumentAdapter implements MethodCallHa | @@ -182,6 +182,11 @@ public class PrintingPlugin extends PrintDocumentAdapter implements MethodCallHa | ||
| 182 | 182 | ||
| 183 | result.success(0); | 183 | result.success(0); |
| 184 | break; | 184 | break; |
| 185 | + case "cancelJob": | ||
| 186 | + if (callback != null) callback.onLayoutCancelled(); | ||
| 187 | + if (printJob != null) printJob.cancel(); | ||
| 188 | + result.success(0); | ||
| 189 | + break; | ||
| 185 | case "sharePdf": | 190 | case "sharePdf": |
| 186 | sharePdf((byte[]) call.argument("doc"), (String) call.argument("name")); | 191 | sharePdf((byte[]) call.argument("doc"), (String) call.argument("name")); |
| 187 | result.success(0); | 192 | result.success(0); |
| @@ -40,6 +40,11 @@ class PdfPrintPageRenderer: UIPrintPageRenderer { | @@ -40,6 +40,11 @@ class PdfPrintPageRenderer: UIPrintPageRenderer { | ||
| 40 | ctx?.drawPDFPage(page!) | 40 | ctx?.drawPDFPage(page!) |
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | + func cancelJob() { | ||
| 44 | + pdfDocument = nil | ||
| 45 | + lock?.unlock() | ||
| 46 | + } | ||
| 47 | + | ||
| 43 | func setDocument(_ data: Data?) { | 48 | func setDocument(_ data: Data?) { |
| 44 | let bytesPointer = UnsafeMutablePointer<UInt8>.allocate(capacity: data?.count ?? 0) | 49 | let bytesPointer = UnsafeMutablePointer<UInt8>.allocate(capacity: data?.count ?? 0) |
| 45 | data?.copyBytes(to: bytesPointer, count: data?.count ?? 0) | 50 | data?.copyBytes(to: bytesPointer, count: data?.count ?? 0) |
| @@ -45,6 +45,11 @@ public class SwiftPrintingPlugin: NSObject, FlutterPlugin, UIPrintInteractionCon | @@ -45,6 +45,11 @@ public class SwiftPrintingPlugin: NSObject, FlutterPlugin, UIPrintInteractionCon | ||
| 45 | writePdf(object) | 45 | writePdf(object) |
| 46 | } | 46 | } |
| 47 | result(NSNumber(value: 1)) | 47 | result(NSNumber(value: 1)) |
| 48 | + } else if call.method == "cancelJob" { | ||
| 49 | + renderer?.cancelJob() | ||
| 50 | + let controller = UIPrintInteractionController.shared | ||
| 51 | + controller.dismiss(animated: true) | ||
| 52 | + result(NSNumber(value: 1)) | ||
| 48 | } else if call.method == "sharePdf" { | 53 | } else if call.method == "sharePdf" { |
| 49 | if let object = args["doc"] as? FlutterStandardTypedData { | 54 | if let object = args["doc"] as? FlutterStandardTypedData { |
| 50 | sharePdf( | 55 | sharePdf( |
| @@ -28,18 +28,28 @@ mixin Printing { | @@ -28,18 +28,28 @@ mixin Printing { | ||
| 28 | static Future<void> _handleMethod(MethodCall call) async { | 28 | static Future<void> _handleMethod(MethodCall call) async { |
| 29 | switch (call.method) { | 29 | switch (call.method) { |
| 30 | case 'onLayout': | 30 | case 'onLayout': |
| 31 | - final List<int> bytes = await _onLayout(PdfPageFormat( | ||
| 32 | - call.arguments['width'], | ||
| 33 | - call.arguments['height'], | ||
| 34 | - marginLeft: call.arguments['marginLeft'], | ||
| 35 | - marginTop: call.arguments['marginTop'], | ||
| 36 | - marginRight: call.arguments['marginRight'], | ||
| 37 | - marginBottom: call.arguments['marginBottom'], | ||
| 38 | - )); | ||
| 39 | - final Map<String, dynamic> params = <String, dynamic>{ | ||
| 40 | - 'doc': Uint8List.fromList(bytes), | ||
| 41 | - }; | ||
| 42 | - return await _channel.invokeMethod('writePdf', params); | 31 | + try { |
| 32 | + final List<int> bytes = await _onLayout(PdfPageFormat( | ||
| 33 | + call.arguments['width'], | ||
| 34 | + call.arguments['height'], | ||
| 35 | + marginLeft: call.arguments['marginLeft'], | ||
| 36 | + marginTop: call.arguments['marginTop'], | ||
| 37 | + marginRight: call.arguments['marginRight'], | ||
| 38 | + marginBottom: call.arguments['marginBottom'], | ||
| 39 | + )); | ||
| 40 | + if (bytes == null) { | ||
| 41 | + await _channel.invokeMethod<void>('cancelJob', <String, dynamic>{}); | ||
| 42 | + break; | ||
| 43 | + } | ||
| 44 | + final Map<String, dynamic> params = <String, dynamic>{ | ||
| 45 | + 'doc': Uint8List.fromList(bytes), | ||
| 46 | + }; | ||
| 47 | + await _channel.invokeMethod<void>('writePdf', params); | ||
| 48 | + } catch (e) { | ||
| 49 | + print('Unable to print: $e'); | ||
| 50 | + await _channel.invokeMethod<void>('cancelJob', <String, dynamic>{}); | ||
| 51 | + } | ||
| 52 | + break; | ||
| 43 | case 'onCompleted': | 53 | case 'onCompleted': |
| 44 | final bool completed = call.arguments['completed']; | 54 | final bool completed = call.arguments['completed']; |
| 45 | final String error = call.arguments['error']; | 55 | final String error = call.arguments['error']; |
-
Please register or login to post a comment