Showing
6 changed files
with
97 additions
and
51 deletions
@@ -160,15 +160,7 @@ class MethodChannelPrinting extends PrintingPlatform { | @@ -160,15 +160,7 @@ class MethodChannelPrinting extends PrintingPlatform { | ||
160 | final printers = <Printer>[]; | 160 | final printers = <Printer>[]; |
161 | 161 | ||
162 | for (final printer in list) { | 162 | for (final printer in list) { |
163 | - printers.add(Printer( | ||
164 | - url: printer['url'], | ||
165 | - name: printer['name'], | ||
166 | - model: printer['model'], | ||
167 | - location: printer['location'], | ||
168 | - comment: printer['comment'], | ||
169 | - isDefault: printer['default'], | ||
170 | - available: printer['available'], | ||
171 | - )); | 163 | + printers.add(Printer.fromMap(printer)); |
172 | } | 164 | } |
173 | 165 | ||
174 | return printers; | 166 | return printers; |
@@ -187,12 +179,7 @@ class MethodChannelPrinting extends PrintingPlatform { | @@ -187,12 +179,7 @@ class MethodChannelPrinting extends PrintingPlatform { | ||
187 | if (printer == null) { | 179 | if (printer == null) { |
188 | return null; | 180 | return null; |
189 | } | 181 | } |
190 | - return Printer( | ||
191 | - url: printer['url'], | ||
192 | - name: printer['name'], | ||
193 | - model: printer['model'], | ||
194 | - location: printer['location'], | ||
195 | - ); | 182 | + return Printer.fromMap(printer); |
196 | } | 183 | } |
197 | 184 | ||
198 | @override | 185 | @override |
@@ -215,6 +202,12 @@ class MethodChannelPrinting extends PrintingPlatform { | @@ -215,6 +202,12 @@ class MethodChannelPrinting extends PrintingPlatform { | ||
215 | 'name': name, | 202 | 'name': name, |
216 | 'printer': printer.url, | 203 | 'printer': printer.url, |
217 | 'doc': bytes, | 204 | 'doc': bytes, |
205 | + 'width': format.width, | ||
206 | + 'height': format.height, | ||
207 | + 'marginLeft': format.marginLeft, | ||
208 | + 'marginTop': format.marginTop, | ||
209 | + 'marginRight': format.marginRight, | ||
210 | + 'marginBottom': format.marginBottom, | ||
218 | 'job': job.index, | 211 | 'job': job.index, |
219 | }; | 212 | }; |
220 | await _channel.invokeMethod<int>('directPrintPdf', params); | 213 | await _channel.invokeMethod<int>('directPrintPdf', params); |
@@ -22,13 +22,27 @@ class Printer { | @@ -22,13 +22,27 @@ class Printer { | ||
22 | /// Create a printer information | 22 | /// Create a printer information |
23 | const Printer({ | 23 | const Printer({ |
24 | @required this.url, | 24 | @required this.url, |
25 | - this.name, | 25 | + String name, |
26 | this.model, | 26 | this.model, |
27 | this.location, | 27 | this.location, |
28 | this.comment, | 28 | this.comment, |
29 | - this.isDefault = false, | ||
30 | - this.available = true, | ||
31 | - }) : assert(url != null); | 29 | + bool isDefault, |
30 | + bool isAvailable, | ||
31 | + }) : assert(url != null), | ||
32 | + name = name ?? url, | ||
33 | + isDefault = isDefault ?? false, | ||
34 | + isAvailable = isAvailable ?? true; | ||
35 | + | ||
36 | + /// Create an information object from a dictionnary | ||
37 | + factory Printer.fromMap(Map<dynamic, dynamic> map) => Printer( | ||
38 | + url: map['url'], | ||
39 | + name: map['name'], | ||
40 | + model: map['model'], | ||
41 | + location: map['location'], | ||
42 | + comment: map['comment'], | ||
43 | + isDefault: map['default'], | ||
44 | + isAvailable: map['available'], | ||
45 | + ); | ||
32 | 46 | ||
33 | /// The platform specific printer identification | 47 | /// The platform specific printer identification |
34 | final String url; | 48 | final String url; |
@@ -49,8 +63,14 @@ class Printer { | @@ -49,8 +63,14 @@ class Printer { | ||
49 | final bool isDefault; | 63 | final bool isDefault; |
50 | 64 | ||
51 | /// The printer is available for printing | 65 | /// The printer is available for printing |
52 | - final bool available; | 66 | + final bool isAvailable; |
53 | 67 | ||
54 | @override | 68 | @override |
55 | - String toString() => name ?? url; | 69 | + String toString() => '''$runtimeType $name |
70 | + url:$url | ||
71 | + location:$location | ||
72 | + model:$model | ||
73 | + comment:$comment | ||
74 | + isDefault:$isDefault | ||
75 | + isAvailable: $isAvailable'''; | ||
56 | } | 76 | } |
@@ -91,7 +91,7 @@ mixin Printing { | @@ -91,7 +91,7 @@ mixin Printing { | ||
91 | title: Text(title ?? 'Select Printer'), | 91 | title: Text(title ?? 'Select Printer'), |
92 | children: [ | 92 | children: [ |
93 | for (final printer in printers) | 93 | for (final printer in printers) |
94 | - if (printer.available) | 94 | + if (printer.isAvailable) |
95 | SimpleDialogOption( | 95 | SimpleDialogOption( |
96 | child: Text( | 96 | child: Text( |
97 | printer.name, | 97 | printer.name, |
@@ -72,7 +72,7 @@ class PrintingInfo { | @@ -72,7 +72,7 @@ class PrintingInfo { | ||
72 | final bool canRaster; | 72 | final bool canRaster; |
73 | 73 | ||
74 | @override | 74 | @override |
75 | - String toString() => '''PrintingInfo: | 75 | + String toString() => '''$runtimeType: |
76 | canPrint: $canPrint | 76 | canPrint: $canPrint |
77 | directPrint: $directPrint | 77 | directPrint: $directPrint |
78 | dynamicLayout: $dynamicLayout | 78 | dynamicLayout: $dynamicLayout |
@@ -80,17 +80,4 @@ class PrintingInfo { | @@ -80,17 +80,4 @@ class PrintingInfo { | ||
80 | canListPrinters: $canListPrinters | 80 | canListPrinters: $canListPrinters |
81 | canShare: $canShare | 81 | canShare: $canShare |
82 | canRaster: $canRaster'''; | 82 | canRaster: $canRaster'''; |
83 | - | ||
84 | - /// Returns a map representation of this object | ||
85 | - Map<dynamic, dynamic> asMap() { | ||
86 | - return <dynamic, dynamic>{ | ||
87 | - 'canPrint': canPrint, | ||
88 | - 'directPrint': directPrint, | ||
89 | - 'dynamicLayout': dynamicLayout, | ||
90 | - 'canConvertHtml': canConvertHtml, | ||
91 | - 'canListPrinters': canListPrinters, | ||
92 | - 'canShare': canShare, | ||
93 | - 'canRaster': canRaster, | ||
94 | - }; | ||
95 | - } | ||
96 | } | 83 | } |
@@ -43,8 +43,10 @@ public class PrintJob: NSView, NSSharingServicePickerDelegate { | @@ -43,8 +43,10 @@ public class PrintJob: NSView, NSSharingServicePickerDelegate { | ||
43 | 43 | ||
44 | // Return the number of pages available for printing | 44 | // Return the number of pages available for printing |
45 | override public func knowsPageRange(_ range: NSRangePointer) -> Bool { | 45 | override public func knowsPageRange(_ range: NSRangePointer) -> Bool { |
46 | - setFrameSize(printOperation!.printPanel.printInfo.paperSize) | ||
47 | - setBoundsSize(printOperation!.printPanel.printInfo.paperSize) | 46 | + let size = printOperation!.showsPrintPanel ? printOperation!.printPanel.printInfo.paperSize : printOperation!.printInfo.paperSize |
47 | + | ||
48 | + setFrameSize(size) | ||
49 | + setBoundsSize(size) | ||
48 | range.pointee.length = pdfDocument?.numberOfPages ?? 0 | 50 | range.pointee.length = pdfDocument?.numberOfPages ?? 0 |
49 | return true | 51 | return true |
50 | } | 52 | } |
@@ -78,7 +80,47 @@ public class PrintJob: NSView, NSSharingServicePickerDelegate { | @@ -78,7 +80,47 @@ public class PrintJob: NSView, NSSharingServicePickerDelegate { | ||
78 | } | 80 | } |
79 | } | 81 | } |
80 | 82 | ||
81 | - public func directPrintPdf(name _: String, data _: Data, withPrinter _: String) {} | 83 | + public func listPrinters() -> [NSDictionary] { |
84 | + var printers: Array = [NSDictionary]() | ||
85 | + | ||
86 | + for name in NSPrinter.printerNames { | ||
87 | + let printer = NSPrinter(name: name) | ||
88 | + let pr: NSDictionary = [ | ||
89 | + "url": name, | ||
90 | + "name": name, | ||
91 | + "model": printer!.type, | ||
92 | + ] | ||
93 | + printers.append(pr) | ||
94 | + } | ||
95 | + | ||
96 | + return printers | ||
97 | + } | ||
98 | + | ||
99 | + public func directPrintPdf(name: String, data: Data, withPrinter printer: String, width: CGFloat, height: CGFloat) { | ||
100 | + let sharedInfo = NSPrintInfo.shared | ||
101 | + let sharedDict = sharedInfo.dictionary() | ||
102 | + let printInfoDict = NSMutableDictionary(dictionary: sharedDict) | ||
103 | + let printInfo = NSPrintInfo(dictionary: printInfoDict as! [NSPrintInfo.AttributeKey: Any]) | ||
104 | + printInfo.printer = NSPrinter(name: printer)! | ||
105 | + | ||
106 | + let bytesPointer = UnsafeMutablePointer<UInt8>.allocate(capacity: data.count) | ||
107 | + data.copyBytes(to: bytesPointer, count: data.count) | ||
108 | + let dataProvider = CGDataProvider(dataInfo: nil, data: bytesPointer, size: data.count, releaseData: dataProviderReleaseDataCallback) | ||
109 | + pdfDocument = CGPDFDocument(dataProvider!) | ||
110 | + printInfo.paperSize = NSSize(width: width, height: height) | ||
111 | + if width > height { | ||
112 | + printInfo.orientation = NSPrintInfo.PaperOrientation.landscape | ||
113 | + } | ||
114 | + | ||
115 | + // Print the custom view | ||
116 | + printOperation = NSPrintOperation(view: self, printInfo: printInfo) | ||
117 | + printOperation!.jobTitle = name | ||
118 | + printOperation!.showsPrintPanel = false | ||
119 | + printOperation!.showsProgressPanel = false | ||
120 | + | ||
121 | + let window = NSApplication.shared.mainWindow! | ||
122 | + printOperation!.runModal(for: window, delegate: self, didRun: #selector(printOperationDidRun(printOperation:success:contextInfo:)), contextInfo: nil) | ||
123 | + } | ||
82 | 124 | ||
83 | public func printPdf(name: String, withPageSize size: CGSize, andMargin _: CGRect) { | 125 | public func printPdf(name: String, withPageSize size: CGSize, andMargin _: CGRect) { |
84 | let sharedInfo = NSPrintInfo.shared | 126 | let sharedInfo = NSPrintInfo.shared |
@@ -86,6 +128,7 @@ public class PrintJob: NSView, NSSharingServicePickerDelegate { | @@ -86,6 +128,7 @@ public class PrintJob: NSView, NSSharingServicePickerDelegate { | ||
86 | let printInfoDict = NSMutableDictionary(dictionary: sharedDict) | 128 | let printInfoDict = NSMutableDictionary(dictionary: sharedDict) |
87 | let printInfo = NSPrintInfo(dictionary: printInfoDict as! [NSPrintInfo.AttributeKey: Any]) | 129 | let printInfo = NSPrintInfo(dictionary: printInfoDict as! [NSPrintInfo.AttributeKey: Any]) |
88 | 130 | ||
131 | + printInfo.paperSize = size | ||
89 | if size.width > size.height { | 132 | if size.width > size.height { |
90 | printInfo.orientation = NSPrintInfo.PaperOrientation.landscape | 133 | printInfo.orientation = NSPrintInfo.PaperOrientation.landscape |
91 | } | 134 | } |
@@ -171,10 +214,6 @@ public class PrintJob: NSView, NSSharingServicePickerDelegate { | @@ -171,10 +214,6 @@ public class PrintJob: NSView, NSSharingServicePickerDelegate { | ||
171 | } | 214 | } |
172 | } | 215 | } |
173 | 216 | ||
174 | - public static func pickPrinter(result: @escaping FlutterResult, withSourceRect _: CGRect) { | ||
175 | - result(NSNumber(value: 1)) | ||
176 | - } | ||
177 | - | ||
178 | public func rasterPdf(data: Data, pages: [Int]?, scale: CGFloat) { | 217 | public func rasterPdf(data: Data, pages: [Int]?, scale: CGFloat) { |
179 | let provider = CGDataProvider(data: data as CFData)! | 218 | let provider = CGDataProvider(data: data as CFData)! |
180 | let document = CGPDFDocument(provider)! | 219 | let document = CGPDFDocument(provider)! |
@@ -220,12 +259,13 @@ public class PrintJob: NSView, NSSharingServicePickerDelegate { | @@ -220,12 +259,13 @@ public class PrintJob: NSView, NSSharingServicePickerDelegate { | ||
220 | 259 | ||
221 | public static func printingInfo() -> NSDictionary { | 260 | public static func printingInfo() -> NSDictionary { |
222 | let data: NSDictionary = [ | 261 | let data: NSDictionary = [ |
223 | - "directPrint": false, | 262 | + "directPrint": true, |
224 | "dynamicLayout": false, | 263 | "dynamicLayout": false, |
225 | "canPrint": true, | 264 | "canPrint": true, |
226 | "canConvertHtml": true, | 265 | "canConvertHtml": true, |
227 | "canShare": true, | 266 | "canShare": true, |
228 | "canRaster": true, | 267 | "canRaster": true, |
268 | + "canListPrinters": true, | ||
229 | ] | 269 | ] |
230 | return data | 270 | return data |
231 | } | 271 | } |
@@ -56,13 +56,19 @@ public class PrintingPlugin: NSObject, FlutterPlugin { | @@ -56,13 +56,19 @@ public class PrintingPlugin: NSObject, FlutterPlugin { | ||
56 | height: height - marginBottom - marginTop | 56 | height: height - marginBottom - marginTop |
57 | )) | 57 | )) |
58 | result(NSNumber(value: 1)) | 58 | result(NSNumber(value: 1)) |
59 | -// } else if call.method == "directPrintPdf" { | ||
60 | -// let name = args["name"] as! String | ||
61 | -// let printer = args["printer"] as! String | ||
62 | -// let object = args["doc"] as! FlutterStandardTypedData | ||
63 | -// let printJob = PrintJob(printing: self, index: args["job"] as! Int) | ||
64 | -// printJob.directPrintPdf(name: name, data: object.data, withPrinter: printer) | ||
65 | -// result(NSNumber(value: 1)) | 59 | + } else if call.method == "listPrinters" { |
60 | + let printJob = PrintJob(printing: self, index: -1) | ||
61 | + let r = printJob.listPrinters() | ||
62 | + result(r) | ||
63 | + } else if call.method == "directPrintPdf" { | ||
64 | + let name = args["name"] as! String | ||
65 | + let printer = args["printer"] as! String | ||
66 | + let object = args["doc"] as! FlutterStandardTypedData | ||
67 | + let width = CGFloat((args["width"] as? NSNumber)?.floatValue ?? 0.0) | ||
68 | + let height = CGFloat((args["height"] as? NSNumber)?.floatValue ?? 0.0) | ||
69 | + let printJob = PrintJob(printing: self, index: args["job"] as! Int) | ||
70 | + printJob.directPrintPdf(name: name, data: object.data, withPrinter: printer, width: width, height: height) | ||
71 | + result(NSNumber(1)) | ||
66 | } else if call.method == "sharePdf" { | 72 | } else if call.method == "sharePdf" { |
67 | let object = args["doc"] as! FlutterStandardTypedData | 73 | let object = args["doc"] as! FlutterStandardTypedData |
68 | PrintJob.sharePdf( | 74 | PrintJob.sharePdf( |
-
Please register or login to post a comment