David PHAM-VAN

Cancel print job in case of layout error

... ... @@ -3,6 +3,7 @@
## 2.1.6
- Add qrcode to example
- Cancel print job in case of layout error
## 2.1.5
... ...
... ... @@ -149,7 +149,7 @@ public class PrintingPlugin extends PrintDocumentAdapter implements MethodCallHa
}
} catch (Exception e) {
HashMap<String, Object> args = new HashMap<>();
args.put("completed", printJob.isCompleted());
args.put("completed", printJob != null && printJob.isCompleted());
args.put("error", e.getMessage());
channel.invokeMethod("onCompleted", args);
}
... ... @@ -182,6 +182,11 @@ public class PrintingPlugin extends PrintDocumentAdapter implements MethodCallHa
result.success(0);
break;
case "cancelJob":
if (callback != null) callback.onLayoutCancelled();
if (printJob != null) printJob.cancel();
result.success(0);
break;
case "sharePdf":
sharePdf((byte[]) call.argument("doc"), (String) call.argument("name"));
result.success(0);
... ...
... ... @@ -40,6 +40,11 @@ class PdfPrintPageRenderer: UIPrintPageRenderer {
ctx?.drawPDFPage(page!)
}
func cancelJob() {
pdfDocument = nil
lock?.unlock()
}
func setDocument(_ data: Data?) {
let bytesPointer = UnsafeMutablePointer<UInt8>.allocate(capacity: data?.count ?? 0)
data?.copyBytes(to: bytesPointer, count: data?.count ?? 0)
... ...
... ... @@ -45,6 +45,11 @@ public class SwiftPrintingPlugin: NSObject, FlutterPlugin, UIPrintInteractionCon
writePdf(object)
}
result(NSNumber(value: 1))
} else if call.method == "cancelJob" {
renderer?.cancelJob()
let controller = UIPrintInteractionController.shared
controller.dismiss(animated: true)
result(NSNumber(value: 1))
} else if call.method == "sharePdf" {
if let object = args["doc"] as? FlutterStandardTypedData {
sharePdf(
... ...
... ... @@ -28,6 +28,7 @@ mixin Printing {
static Future<void> _handleMethod(MethodCall call) async {
switch (call.method) {
case 'onLayout':
try {
final List<int> bytes = await _onLayout(PdfPageFormat(
call.arguments['width'],
call.arguments['height'],
... ... @@ -36,10 +37,19 @@ mixin Printing {
marginRight: call.arguments['marginRight'],
marginBottom: call.arguments['marginBottom'],
));
if (bytes == null) {
await _channel.invokeMethod<void>('cancelJob', <String, dynamic>{});
break;
}
final Map<String, dynamic> params = <String, dynamic>{
'doc': Uint8List.fromList(bytes),
};
return await _channel.invokeMethod('writePdf', params);
await _channel.invokeMethod<void>('writePdf', params);
} catch (e) {
print('Unable to print: $e');
await _channel.invokeMethod<void>('cancelJob', <String, dynamic>{});
}
break;
case 'onCompleted':
final bool completed = call.arguments['completed'];
final String error = call.arguments['error'];
... ...