Search code examples
objective-cxcodeswiftwritetofile

How to recover PDF's from .writetoFile in Swift


I'm saving an image using .writetofile but I don't know how to recover it. This how I save the image:

self.pdfData.writeToURL(NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first!.URLByAppendingPathComponent("testgogo.pdf"), atomically: true) // what it is saved as


        self.pdfData.writeToFile("tessst.pdf", atomically: false)
        print(NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first!.path!)


        var pdfData: NSData {
            let result = NSMutableData()
            UIGraphicsBeginPDFContextToData(result, frame, nil)
            guard let context = UIGraphicsGetCurrentContext()
  else { return result }

     UIGraphicsBeginPDFPage()
     layer.renderInContext(context)
     UIGraphicsEndPDFContext()
     return result
}

How can I fetch the image back later on ?


Solution

  • Here is an example of how you could do it in Swift 2.x.

    It uses the NSData(contentsOfFile: myFilePath) to load the file. The example uses a PNG file.

    Directly from my Playground:

    import UIKit
    
    /*
     * Creates an UIImage from a UIView
     */
    func createImage(fromView view: UIView) -> UIImage {
        UIGraphicsBeginImageContext(view.frame.size)
        let context = UIGraphicsGetCurrentContext()
        view.layer.renderInContext(context!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext();
        return image
    }
    
    /*
     * Finds the path in Document folder
     */
    func createMyFilePath(forFileName fileName: String) -> String? {
        let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask,true)
        if let path = paths.first {
            return path + "/\(fileName)"
        }
        return nil
    }
    
    /*
     * Main behaviour
     */
    
    // ImageView with Label on it
    let imageView = UIImageView(image: UIImage(named: "borat"))
    let label = UILabel(frame: imageView.frame)
    label.font = UIFont(name: "helvetica", size: 40)
    label.text = "Great Success!"
    imageView .addSubview(label)
    
    // Find the path where to save
    guard let myFilePath = createMyFilePath(forFileName: "borat-with-label.png") else {
        print("Cannot generate file path ☹️")
        exit(0)
    }
    
    // Use this to check in finder where your file is saved
    print(myFilePath)
    
    // Transform the imageView in UIImage to save it
    let imageToSave = createImage(fromView: imageView)
    
    // Get the image as data
    guard let imageToSaveAsData = UIImagePNGRepresentation(imageToSave) else {
        print("Cannot transform image to data ☹️")
        exit(1)
    }
    
    // Save to Disk!
    do{
        try imageToSaveAsData.writeToFile(myFilePath, options: .DataWritingAtomic)
    } catch {
        print("Error, cannot write to the location \(myFilePath)")
    }
    
    // Load from Disk!
    let loadedImageData = NSData(contentsOfFile: myFilePath)
    
    // Check the data is the same
    if loadedImageData == imageToSaveAsData {
        print("✌️")
    }
    
    // Have a look at the loaded image!
    UIImage(data: loadedImageData!)