Search code examples
iosswiftpdfpdfkit

Saving PDF Files with Swift in iOS and display them


I want to build an app which also includes the possibility to show and save PDFs inside the app and display them (as a FileSystem) within a tableview and open them when I tap on one PDF.

Here are my important questions for that:

1. How do I save a PDF local on my app ( for example if the user can enter a url) and where exactly will it save it ?

2. When saved, how can I show all the local storaged files within a tableview to open them?


Solution

  • Since several people requested this, here is the equivalent to the first answer in Swift:

    //The URL to Save
    let yourURL = NSURL(string: "http://somewebsite.com/somefile.pdf")
    //Create a URL request
    let urlRequest = NSURLRequest(URL: yourURL!)
    //get the data
    let theData = NSURLConnection.sendSynchronousRequest(urlRequest, returningResponse: nil, error: nil)
    
    //Get the local docs directory and append your local filename.
    var docURL = (NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)).last as? NSURL
    
    docURL = docURL?.URLByAppendingPathComponent( "myFileName.pdf")
    
    //Lastly, write your file to the disk.
    theData?.writeToURL(docURL!, atomically: true)
    

    Also, since this code uses a synchronous network request, I highly recommend dispatching it to a background queue:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in
        //The URL to Save
        let yourURL = NSURL(string: "http://somewebsite.com/somefile.pdf")
        //Create a URL request
        let urlRequest = NSURLRequest(URL: yourURL!)
        //get the data
        let theData = NSURLConnection.sendSynchronousRequest(urlRequest, returningResponse: nil, error: nil)
    
        //Get the local docs directory and append your local filename.
        var docURL = (NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)).last as? NSURL
    
        docURL = docURL?.URLByAppendingPathComponent( "myFileName.pdf")
    
        //Lastly, write your file to the disk.
        theData?.writeToURL(docURL!, atomically: true)
    })
    

    And the answer to second question in Swift:

    //Getting a list of the docs directory
    let docURL = (NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).last) as? NSURL
    
    //put the contents in an array.
    var contents = (NSFileManager.defaultManager().contentsOfDirectoryAtURL(docURL!, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions.SkipsHiddenFiles, error: nil))
    //print the file listing to the console
    println(contents)