David PHAM-VAN

Update format

@@ -8,6 +8,7 @@ @@ -8,6 +8,7 @@
8 - Fix wrong format in directPrintPdf [<AlhasanAlQaisi>] 8 - Fix wrong format in directPrintPdf [<AlhasanAlQaisi>]
9 - Add compatibility with Android Gradle Plugin 8.0 [asaarnak] 9 - Add compatibility with Android Gradle Plugin 8.0 [asaarnak]
10 - Add compatibility with Flutter 3.10 10 - Add compatibility with Flutter 3.10
  11 +- Re-init UIPrinter cause issues with delegate [Hasan]
11 12
12 ## 5.10.3 13 ## 5.10.3
13 14
@@ -36,14 +36,14 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate @@ -36,14 +36,14 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate
36 private let semaphore = DispatchSemaphore(value: 0) 36 private let semaphore = DispatchSemaphore(value: 0)
37 private var dynamic = false 37 private var dynamic = false
38 private var currentSize: CGSize? 38 private var currentSize: CGSize?
39 - 39 +
40 public init(printing: PrintingPlugin, index: Int) { 40 public init(printing: PrintingPlugin, index: Int) {
41 self.printing = printing 41 self.printing = printing
42 self.index = index 42 self.index = index
43 pdfDocument = nil 43 pdfDocument = nil
44 super.init() 44 super.init()
45 } 45 }
46 - 46 +
47 override public func drawPage(at pageIndex: Int, in _: CGRect) { 47 override public func drawPage(at pageIndex: Int, in _: CGRect) {
48 let ctx = UIGraphicsGetCurrentContext() 48 let ctx = UIGraphicsGetCurrentContext()
49 let page = pdfDocument?.page(at: pageIndex + 1) 49 let page = pdfDocument?.page(at: pageIndex + 1)
@@ -53,7 +53,7 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate @@ -53,7 +53,7 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate
53 ctx?.drawPDFPage(page!) 53 ctx?.drawPDFPage(page!)
54 } 54 }
55 } 55 }
56 - 56 +
57 func cancelJob(_ error: String?) { 57 func cancelJob(_ error: String?) {
58 pdfDocument = nil 58 pdfDocument = nil
59 if dynamic { 59 if dynamic {
@@ -62,23 +62,23 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate @@ -62,23 +62,23 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate
62 printing.onCompleted(printJob: self, completed: false, error: error as NSString?) 62 printing.onCompleted(printJob: self, completed: false, error: error as NSString?)
63 } 63 }
64 } 64 }
65 - 65 +
66 func setDocument(_ data: Data?) { 66 func setDocument(_ data: Data?) {
67 let bytesPointer = UnsafeMutablePointer<UInt8>.allocate(capacity: data?.count ?? 0) 67 let bytesPointer = UnsafeMutablePointer<UInt8>.allocate(capacity: data?.count ?? 0)
68 data?.copyBytes(to: bytesPointer, count: data?.count ?? 0) 68 data?.copyBytes(to: bytesPointer, count: data?.count ?? 0)
69 let dataProvider = CGDataProvider(dataInfo: nil, data: bytesPointer, size: data?.count ?? 0, releaseData: dataProviderReleaseDataCallback) 69 let dataProvider = CGDataProvider(dataInfo: nil, data: bytesPointer, size: data?.count ?? 0, releaseData: dataProviderReleaseDataCallback)
70 pdfDocument = CGPDFDocument(dataProvider!) 70 pdfDocument = CGPDFDocument(dataProvider!)
71 - 71 +
72 if dynamic { 72 if dynamic {
73 // Unblock the main thread 73 // Unblock the main thread
74 semaphore.signal() 74 semaphore.signal()
75 return 75 return
76 } 76 }
77 - 77 +
78 DispatchQueue.main.async { [self] in 78 DispatchQueue.main.async { [self] in
79 let controller = UIPrintInteractionController.shared 79 let controller = UIPrintInteractionController.shared
80 controller.delegate = self 80 controller.delegate = self
81 - 81 +
82 let printInfo = UIPrintInfo.printInfo() 82 let printInfo = UIPrintInfo.printInfo()
83 printInfo.jobName = jobName! 83 printInfo.jobName = jobName!
84 printInfo.outputType = .general 84 printInfo.outputType = .general
@@ -88,27 +88,27 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate @@ -88,27 +88,27 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate
88 } 88 }
89 controller.printInfo = printInfo 89 controller.printInfo = printInfo
90 controller.printPageRenderer = self 90 controller.printPageRenderer = self
91 - 91 +
92 if self.printerName != nil { 92 if self.printerName != nil {
93 let printerURL = URL(string: self.printerName!) 93 let printerURL = URL(string: self.printerName!)
94 - 94 +
95 if printerURL == nil { 95 if printerURL == nil {
96 self.printing.onCompleted(printJob: self, completed: false, error: "Unable to find printer URL") 96 self.printing.onCompleted(printJob: self, completed: false, error: "Unable to find printer URL")
97 return 97 return
98 } 98 }
99 - 99 +
100 let printerURLString = printerURL!.absoluteString 100 let printerURLString = printerURL!.absoluteString
101 - 101 +
102 if !selectedPrinters.keys.contains(printerURLString) { 102 if !selectedPrinters.keys.contains(printerURLString) {
103 selectedPrinters[printerURLString] = UIPrinter(url: printerURL!) 103 selectedPrinters[printerURLString] = UIPrinter(url: printerURL!)
104 } 104 }
105 - 105 +
106 selectedPrinters[printerURLString]!.contactPrinter { available in 106 selectedPrinters[printerURLString]!.contactPrinter { available in
107 if !available { 107 if !available {
108 self.printing.onCompleted(printJob: self, completed: false, error: "Printer not available") 108 self.printing.onCompleted(printJob: self, completed: false, error: "Printer not available")
109 return 109 return
110 } 110 }
111 - 111 +
112 controller.print(to: selectedPrinters[printerURLString]!, completionHandler: self.completionHandler) 112 controller.print(to: selectedPrinters[printerURLString]!, completionHandler: self.completionHandler)
113 } 113 }
114 } else { 114 } else {
@@ -116,7 +116,7 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate @@ -116,7 +116,7 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate
116 } 116 }
117 } 117 }
118 } 118 }
119 - 119 +
120 override public var numberOfPages: Int { 120 override public var numberOfPages: Int {
121 if dynamic { 121 if dynamic {
122 printing.onLayout( 122 printing.onLayout(
@@ -128,32 +128,32 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate @@ -128,32 +128,32 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate
128 marginRight: paperRect.size.width - (printableRect.origin.x + printableRect.size.width), 128 marginRight: paperRect.size.width - (printableRect.origin.x + printableRect.size.width),
129 marginBottom: paperRect.size.height - (printableRect.origin.y + printableRect.size.height) 129 marginBottom: paperRect.size.height - (printableRect.origin.y + printableRect.size.height)
130 ) 130 )
131 - 131 +
132 // Block the main thread, waiting for a document 132 // Block the main thread, waiting for a document
133 semaphore.wait() 133 semaphore.wait()
134 } 134 }
135 - 135 +
136 return pdfDocument?.numberOfPages ?? 0 136 return pdfDocument?.numberOfPages ?? 0
137 } 137 }
138 - 138 +
139 func completionHandler(printController _: UIPrintInteractionController, completed: Bool, error: Error?) { 139 func completionHandler(printController _: UIPrintInteractionController, completed: Bool, error: Error?) {
140 if !completed, error != nil { 140 if !completed, error != nil {
141 print("Unable to print: \(error?.localizedDescription ?? "unknown error")") 141 print("Unable to print: \(error?.localizedDescription ?? "unknown error")")
142 } 142 }
143 - 143 +
144 printing.onCompleted(printJob: self, completed: completed, error: error?.localizedDescription as NSString?) 144 printing.onCompleted(printJob: self, completed: completed, error: error?.localizedDescription as NSString?)
145 } 145 }
146 -  
147 - public func printInteractionController(_ printController: UIPrintInteractionController, choosePaper paperList: [UIPrintPaper]) -> UIPrintPaper { 146 +
  147 + public func printInteractionController(_: UIPrintInteractionController, choosePaper paperList: [UIPrintPaper]) -> UIPrintPaper {
148 if currentSize == nil { 148 if currentSize == nil {
149 return paperList[0] 149 return paperList[0]
150 } 150 }
151 - 151 +
152 let bestPaper = UIPrintPaper.bestPaper(forPageSize: currentSize!, withPapersFrom: paperList) 152 let bestPaper = UIPrintPaper.bestPaper(forPageSize: currentSize!, withPapersFrom: paperList)
153 - 153 +
154 return bestPaper 154 return bestPaper
155 } 155 }
156 - 156 +
157 func printPdf(name: String, withPageSize size: CGSize, andMargin margin: CGRect, withPrinter printerID: String?, dynamically dyn: Bool) { 157 func printPdf(name: String, withPageSize size: CGSize, andMargin margin: CGRect, withPrinter printerID: String?, dynamically dyn: Bool) {
158 currentSize = size 158 currentSize = size
159 dynamic = dyn 159 dynamic = dyn
@@ -162,17 +162,17 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate @@ -162,17 +162,17 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate
162 self.printing.onCompleted(printJob: self, completed: false, error: "Printing not available") 162 self.printing.onCompleted(printJob: self, completed: false, error: "Printing not available")
163 return 163 return
164 } 164 }
165 - 165 +
166 if size.width > size.height { 166 if size.width > size.height {
167 orientation = UIPrintInfo.Orientation.landscape 167 orientation = UIPrintInfo.Orientation.landscape
168 } 168 }
169 - 169 +
170 jobName = name 170 jobName = name
171 printerName = printerID 171 printerName = printerID
172 - 172 +
173 let controller = UIPrintInteractionController.shared 173 let controller = UIPrintInteractionController.shared
174 controller.delegate = self 174 controller.delegate = self
175 - 175 +
176 let printInfo = UIPrintInfo.printInfo() 176 let printInfo = UIPrintInfo.printInfo()
177 printInfo.jobName = jobName! 177 printInfo.jobName = jobName!
178 printInfo.outputType = .general 178 printInfo.outputType = .general
@@ -182,40 +182,39 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate @@ -182,40 +182,39 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate
182 } 182 }
183 controller.printInfo = printInfo 183 controller.printInfo = printInfo
184 controller.showsPaperSelectionForLoadedPapers = true 184 controller.showsPaperSelectionForLoadedPapers = true
185 - 185 +
186 controller.printPageRenderer = self 186 controller.printPageRenderer = self
187 - 187 +
188 if printerID != nil { 188 if printerID != nil {
189 let printerURL = URL(string: printerID!) 189 let printerURL = URL(string: printerID!)
190 - 190 +
191 if printerURL == nil { 191 if printerURL == nil {
192 self.printing.onCompleted(printJob: self, completed: false, error: "Unable to find printer URL") 192 self.printing.onCompleted(printJob: self, completed: false, error: "Unable to find printer URL")
193 return 193 return
194 } 194 }
195 - 195 +
196 let printerURLString = printerURL!.absoluteString 196 let printerURLString = printerURL!.absoluteString
197 - 197 +
198 if !selectedPrinters.keys.contains(printerURLString) { 198 if !selectedPrinters.keys.contains(printerURLString) {
199 selectedPrinters[printerURLString] = UIPrinter(url: printerURL!) 199 selectedPrinters[printerURLString] = UIPrinter(url: printerURL!)
200 } 200 }
201 -  
202 - 201 +
203 selectedPrinters[printerURLString]!.contactPrinter { available in 202 selectedPrinters[printerURLString]!.contactPrinter { available in
204 if !available { 203 if !available {
205 self.printing.onCompleted(printJob: self, completed: false, error: "Printer not available") 204 self.printing.onCompleted(printJob: self, completed: false, error: "Printer not available")
206 return 205 return
207 } 206 }
208 - 207 +
209 controller.print(to: selectedPrinters[printerURLString]!, completionHandler: self.completionHandler) 208 controller.print(to: selectedPrinters[printerURLString]!, completionHandler: self.completionHandler)
210 } 209 }
211 return 210 return
212 } 211 }
213 - 212 +
214 if dynamic { 213 if dynamic {
215 controller.present(animated: true, completionHandler: completionHandler) 214 controller.present(animated: true, completionHandler: completionHandler)
216 return 215 return
217 } 216 }
218 - 217 +
219 self.printing.onLayout( 218 self.printing.onLayout(
220 printJob: self, 219 printJob: self,
221 width: size.width, 220 width: size.width,
@@ -226,18 +225,18 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate @@ -226,18 +225,18 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate
226 marginBottom: size.height - margin.maxY 225 marginBottom: size.height - margin.maxY
227 ) 226 )
228 } 227 }
229 - 228 +
230 static func sharePdf(data: Data, withSourceRect rect: CGRect, andName name: String, subject: String?, body: String?) { 229 static func sharePdf(data: Data, withSourceRect rect: CGRect, andName name: String, subject: String?, body: String?) {
231 let tmpDirURL = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true) 230 let tmpDirURL = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true)
232 let fileURL = tmpDirURL.appendingPathComponent(name) 231 let fileURL = tmpDirURL.appendingPathComponent(name)
233 - 232 +
234 do { 233 do {
235 try data.write(to: fileURL, options: .atomic) 234 try data.write(to: fileURL, options: .atomic)
236 } catch { 235 } catch {
237 print("sharePdf error: \(error.localizedDescription)") 236 print("sharePdf error: \(error.localizedDescription)")
238 return 237 return
239 } 238 }
240 - 239 +
241 let activityViewController = UIActivityViewController(activityItems: [fileURL, body as Any], applicationActivities: nil) 240 let activityViewController = UIActivityViewController(activityItems: [fileURL, body as Any], applicationActivities: nil)
242 activityViewController.setValue(subject, forKey: "subject") 241 activityViewController.setValue(subject, forKey: "subject")
243 if UIDevice.current.userInterfaceIdiom == .pad { 242 if UIDevice.current.userInterfaceIdiom == .pad {
@@ -247,7 +246,7 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate @@ -247,7 +246,7 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate
247 } 246 }
248 UIApplication.shared.keyWindow?.rootViewController?.present(activityViewController, animated: true) 247 UIApplication.shared.keyWindow?.rootViewController?.present(activityViewController, animated: true)
249 } 248 }
250 - 249 +
251 func convertHtml(_ data: String, withPageSize rect: CGRect, andMargin margin: CGRect, andBaseUrl baseUrl: URL?) { 250 func convertHtml(_ data: String, withPageSize rect: CGRect, andMargin margin: CGRect, andBaseUrl baseUrl: URL?) {
252 let viewController = UIApplication.shared.delegate?.window?!.rootViewController 251 let viewController = UIApplication.shared.delegate?.window?!.rootViewController
253 let wkWebView = WKWebView(frame: viewController!.view.bounds) 252 let wkWebView = WKWebView(frame: viewController!.view.bounds)
@@ -255,32 +254,32 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate @@ -255,32 +254,32 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate
255 wkWebView.tag = 100 254 wkWebView.tag = 100
256 viewController?.view.addSubview(wkWebView) 255 viewController?.view.addSubview(wkWebView)
257 wkWebView.loadHTMLString(data, baseURL: baseUrl ?? Bundle.main.bundleURL) 256 wkWebView.loadHTMLString(data, baseURL: baseUrl ?? Bundle.main.bundleURL)
258 - 257 +
259 urlObservation = wkWebView.observe(\.isLoading, changeHandler: { _, _ in 258 urlObservation = wkWebView.observe(\.isLoading, changeHandler: { _, _ in
260 // this is workaround for issue with loading local images 259 // this is workaround for issue with loading local images
261 DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 260 DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
262 // assign the print formatter to the print page renderer 261 // assign the print formatter to the print page renderer
263 let renderer = UIPrintPageRenderer() 262 let renderer = UIPrintPageRenderer()
264 renderer.addPrintFormatter(wkWebView.viewPrintFormatter(), startingAtPageAt: 0) 263 renderer.addPrintFormatter(wkWebView.viewPrintFormatter(), startingAtPageAt: 0)
265 - 264 +
266 // assign paperRect and printableRect values 265 // assign paperRect and printableRect values
267 renderer.setValue(rect, forKey: "paperRect") 266 renderer.setValue(rect, forKey: "paperRect")
268 renderer.setValue(margin, forKey: "printableRect") 267 renderer.setValue(margin, forKey: "printableRect")
269 - 268 +
270 // create pdf context and draw each page 269 // create pdf context and draw each page
271 let pdfData = NSMutableData() 270 let pdfData = NSMutableData()
272 UIGraphicsBeginPDFContextToData(pdfData, rect, nil) 271 UIGraphicsBeginPDFContextToData(pdfData, rect, nil)
273 - 272 +
274 for i in 0 ..< renderer.numberOfPages { 273 for i in 0 ..< renderer.numberOfPages {
275 UIGraphicsBeginPDFPage() 274 UIGraphicsBeginPDFPage()
276 renderer.drawPage(at: i, in: UIGraphicsGetPDFContextBounds()) 275 renderer.drawPage(at: i, in: UIGraphicsGetPDFContextBounds())
277 } 276 }
278 - 277 +
279 UIGraphicsEndPDFContext() 278 UIGraphicsEndPDFContext()
280 - 279 +
281 if let viewWithTag = viewController?.view.viewWithTag(wkWebView.tag) { 280 if let viewWithTag = viewController?.view.viewWithTag(wkWebView.tag) {
282 viewWithTag.removeFromSuperview() // remove hidden webview when pdf is generated 281 viewWithTag.removeFromSuperview() // remove hidden webview when pdf is generated
283 - 282 +
284 // clear WKWebView cache 283 // clear WKWebView cache
285 if #available(iOS 9.0, *) { 284 if #available(iOS 9.0, *) {
286 WKWebsiteDataStore.default().fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { records in 285 WKWebsiteDataStore.default().fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { records in
@@ -290,17 +289,17 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate @@ -290,17 +289,17 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate
290 } 289 }
291 } 290 }
292 } 291 }
293 - 292 +
294 // dispose urlObservation 293 // dispose urlObservation
295 self.urlObservation = nil 294 self.urlObservation = nil
296 self.printing.onHtmlRendered(printJob: self, pdfData: pdfData as Data) 295 self.printing.onHtmlRendered(printJob: self, pdfData: pdfData as Data)
297 } 296 }
298 }) 297 })
299 } 298 }
300 - 299 +
301 static func pickPrinter(result: @escaping FlutterResult, withSourceRect rect: CGRect) { 300 static func pickPrinter(result: @escaping FlutterResult, withSourceRect rect: CGRect) {
302 let controller = UIPrinterPickerController(initiallySelectedPrinter: nil) 301 let controller = UIPrinterPickerController(initiallySelectedPrinter: nil)
303 - 302 +
304 let pickPrinterCompletionHandler: UIPrinterPickerController.CompletionHandler = { 303 let pickPrinterCompletionHandler: UIPrinterPickerController.CompletionHandler = {
305 (printerPickerController: UIPrinterPickerController, completed: Bool, error: Error?) in 304 (printerPickerController: UIPrinterPickerController, completed: Bool, error: Error?) in
306 if !completed, error != nil { 305 if !completed, error != nil {
@@ -308,12 +307,12 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate @@ -308,12 +307,12 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate
308 result(nil) 307 result(nil)
309 return 308 return
310 } 309 }
311 - 310 +
312 if printerPickerController.selectedPrinter == nil { 311 if printerPickerController.selectedPrinter == nil {
313 result(nil) 312 result(nil)
314 return 313 return
315 } 314 }
316 - 315 +
317 let printer = printerPickerController.selectedPrinter! 316 let printer = printerPickerController.selectedPrinter!
318 let data: NSDictionary = [ 317 let data: NSDictionary = [
319 "url": printer.url.absoluteString as Any, 318 "url": printer.url.absoluteString as Any,
@@ -323,7 +322,7 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate @@ -323,7 +322,7 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate
323 ] 322 ]
324 result(data) 323 result(data)
325 } 324 }
326 - 325 +
327 if UIDevice.current.userInterfaceIdiom == .pad { 326 if UIDevice.current.userInterfaceIdiom == .pad {
328 let viewController: UIViewController? = UIApplication.shared.keyWindow?.rootViewController 327 let viewController: UIViewController? = UIApplication.shared.keyWindow?.rootViewController
329 if viewController != nil { 328 if viewController != nil {
@@ -331,10 +330,10 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate @@ -331,10 +330,10 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate
331 return 330 return
332 } 331 }
333 } 332 }
334 - 333 +
335 controller.present(animated: true, completionHandler: pickPrinterCompletionHandler) 334 controller.present(animated: true, completionHandler: pickPrinterCompletionHandler)
336 } 335 }
337 - 336 +
338 public func rasterPdf(data: Data, pages: [Int]?, scale: CGFloat) { 337 public func rasterPdf(data: Data, pages: [Int]?, scale: CGFloat) {
339 guard 338 guard
340 let provider = CGDataProvider(data: data as CFData), 339 let provider = CGDataProvider(data: data as CFData),
@@ -343,10 +342,10 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate @@ -343,10 +342,10 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate
343 printing.onPageRasterEnd(printJob: self, error: "Cannot raster a malformed PDF file") 342 printing.onPageRasterEnd(printJob: self, error: "Cannot raster a malformed PDF file")
344 return 343 return
345 } 344 }
346 - 345 +
347 DispatchQueue.global().async { 346 DispatchQueue.global().async {
348 let pageCount = document.numberOfPages 347 let pageCount = document.numberOfPages
349 - 348 +
350 for pageNum in pages ?? Array(0 ... pageCount - 1) { 349 for pageNum in pages ?? Array(0 ... pageCount - 1) {
351 guard let page = document.page(at: pageNum + 1) else { continue } 350 guard let page = document.page(at: pageNum + 1) else { continue }
352 let angle = CGFloat(page.rotationAngle) * CGFloat.pi / -180 351 let angle = CGFloat(page.rotationAngle) * CGFloat.pi / -180
@@ -355,7 +354,7 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate @@ -355,7 +354,7 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate
355 let height = Int(abs((cos(angle) * rect.height + sin(angle) * rect.width) * scale)) 354 let height = Int(abs((cos(angle) * rect.height + sin(angle) * rect.width) * scale))
356 let stride = width * 4 355 let stride = width * 4
357 var data = Data(repeating: 0, count: stride * height) 356 var data = Data(repeating: 0, count: stride * height)
358 - 357 +
359 data.withUnsafeMutableBytes { (outputBytes: UnsafeMutableRawBufferPointer) in 358 data.withUnsafeMutableBytes { (outputBytes: UnsafeMutableRawBufferPointer) in
360 let rgb = CGColorSpaceCreateDeviceRGB() 359 let rgb = CGColorSpaceCreateDeviceRGB()
361 let context = CGContext( 360 let context = CGContext(
@@ -367,7 +366,7 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate @@ -367,7 +366,7 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate
367 space: rgb, 366 space: rgb,
368 bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue 367 bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue
369 ) 368 )
370 - 369 +
371 if context != nil { 370 if context != nil {
372 context!.translateBy(x: CGFloat(width) / 2, y: CGFloat(height) / 2) 371 context!.translateBy(x: CGFloat(width) / 2, y: CGFloat(height) / 2)
373 context!.scaleBy(x: scale, y: scale) 372 context!.scaleBy(x: scale, y: scale)
@@ -376,18 +375,18 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate @@ -376,18 +375,18 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate
376 context!.drawPDFPage(page) 375 context!.drawPDFPage(page)
377 } 376 }
378 } 377 }
379 - 378 +
380 DispatchQueue.main.sync { 379 DispatchQueue.main.sync {
381 self.printing.onPageRasterized(printJob: self, imageData: data, width: width, height: height) 380 self.printing.onPageRasterized(printJob: self, imageData: data, width: width, height: height)
382 } 381 }
383 } 382 }
384 - 383 +
385 DispatchQueue.main.sync { 384 DispatchQueue.main.sync {
386 self.printing.onPageRasterEnd(printJob: self, error: nil) 385 self.printing.onPageRasterEnd(printJob: self, error: nil)
387 } 386 }
388 } 387 }
389 } 388 }
390 - 389 +
391 public static func printingInfo() -> NSDictionary { 390 public static func printingInfo() -> NSDictionary {
392 let data: NSDictionary = [ 391 let data: NSDictionary = [
393 "directPrint": true, 392 "directPrint": true,