Committed by
David PHAM-VAN
Fix raster crash on iOS and MacOS
- use guard let to prevent crashes when CGDataProvider cannot be instantiated
Showing
2 changed files
with
13 additions
and
11 deletions
| @@ -32,7 +32,7 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate | @@ -32,7 +32,7 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate | ||
| 32 | private let semaphore = DispatchSemaphore(value: 0) | 32 | private let semaphore = DispatchSemaphore(value: 0) |
| 33 | private var dynamic = false | 33 | private var dynamic = false |
| 34 | private var currentSize: CGSize? | 34 | private var currentSize: CGSize? |
| 35 | - | 35 | + |
| 36 | public init(printing: PrintingPlugin, index: Int) { | 36 | public init(printing: PrintingPlugin, index: Int) { |
| 37 | self.printing = printing | 37 | self.printing = printing |
| 38 | self.index = index | 38 | self.index = index |
| @@ -312,18 +312,19 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate | @@ -312,18 +312,19 @@ public class PrintJob: UIPrintPageRenderer, UIPrintInteractionControllerDelegate | ||
| 312 | } | 312 | } |
| 313 | 313 | ||
| 314 | public func rasterPdf(data: Data, pages: [Int]?, scale: CGFloat) { | 314 | public func rasterPdf(data: Data, pages: [Int]?, scale: CGFloat) { |
| 315 | - let provider = CGDataProvider(data: data as CFData)! | ||
| 316 | - let document = CGPDFDocument(provider) | ||
| 317 | - if document == nil { | 315 | + guard |
| 316 | + let provider = CGDataProvider(data: data as CFData), | ||
| 317 | + let document = CGPDFDocument(provider) | ||
| 318 | + else { | ||
| 318 | printing.onPageRasterEnd(printJob: self, error: "Cannot raster a malformed PDF file") | 319 | printing.onPageRasterEnd(printJob: self, error: "Cannot raster a malformed PDF file") |
| 319 | return | 320 | return |
| 320 | } | 321 | } |
| 321 | 322 | ||
| 322 | DispatchQueue.global().async { | 323 | DispatchQueue.global().async { |
| 323 | - let pageCount = document!.numberOfPages | 324 | + let pageCount = document.numberOfPages |
| 324 | 325 | ||
| 325 | for pageNum in pages ?? Array(0 ... pageCount - 1) { | 326 | for pageNum in pages ?? Array(0 ... pageCount - 1) { |
| 326 | - guard let page = document!.page(at: pageNum + 1) else { continue } | 327 | + guard let page = document.page(at: pageNum + 1) else { continue } |
| 327 | let angle = CGFloat(page.rotationAngle) * CGFloat.pi / -180 | 328 | let angle = CGFloat(page.rotationAngle) * CGFloat.pi / -180 |
| 328 | let rect = page.getBoxRect(.mediaBox) | 329 | let rect = page.getBoxRect(.mediaBox) |
| 329 | let width = Int(abs((cos(angle) * rect.width + sin(angle) * rect.height) * scale)) | 330 | let width = Int(abs((cos(angle) * rect.width + sin(angle) * rect.height) * scale)) |
| @@ -252,18 +252,19 @@ public class PrintJob: NSView, NSSharingServicePickerDelegate { | @@ -252,18 +252,19 @@ public class PrintJob: NSView, NSSharingServicePickerDelegate { | ||
| 252 | } | 252 | } |
| 253 | 253 | ||
| 254 | public func rasterPdf(data: Data, pages: [Int]?, scale: CGFloat) { | 254 | public func rasterPdf(data: Data, pages: [Int]?, scale: CGFloat) { |
| 255 | - let provider = CGDataProvider(data: data as CFData)! | ||
| 256 | - let document = CGPDFDocument(provider) | ||
| 257 | - if document == nil { | 255 | + guard |
| 256 | + let provider = CGDataProvider(data: data as CFData), | ||
| 257 | + let document = CGPDFDocument(provider) | ||
| 258 | + else { | ||
| 258 | printing.onPageRasterEnd(printJob: self, error: "Cannot raster a malformed PDF file") | 259 | printing.onPageRasterEnd(printJob: self, error: "Cannot raster a malformed PDF file") |
| 259 | return | 260 | return |
| 260 | } | 261 | } |
| 261 | 262 | ||
| 262 | DispatchQueue.global().async { | 263 | DispatchQueue.global().async { |
| 263 | - let pageCount = document!.numberOfPages | 264 | + let pageCount = document.numberOfPages |
| 264 | 265 | ||
| 265 | for pageNum in pages ?? Array(0 ... pageCount - 1) { | 266 | for pageNum in pages ?? Array(0 ... pageCount - 1) { |
| 266 | - guard let page = document!.page(at: pageNum + 1) else { continue } | 267 | + guard let page = document.page(at: pageNum + 1) else { continue } |
| 267 | let angle = CGFloat(page.rotationAngle) * CGFloat.pi / -180 | 268 | let angle = CGFloat(page.rotationAngle) * CGFloat.pi / -180 |
| 268 | let rect = page.getBoxRect(.mediaBox) | 269 | let rect = page.getBoxRect(.mediaBox) |
| 269 | let width = Int(abs((cos(angle) * rect.width + sin(angle) * rect.height) * scale)) | 270 | let width = Int(abs((cos(angle) * rect.width + sin(angle) * rect.height) * scale)) |
-
Please register or login to post a comment