Saving PDF Files with Swift in iOS and display them Saving PDF Files with Swift in iOS and display them ios ios

Saving PDF Files with Swift in iOS and display them


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

//The URL to Savelet yourURL = NSURL(string: "http://somewebsite.com/somefile.pdf")//Create a URL requestlet urlRequest = NSURLRequest(URL: yourURL!)//get the datalet 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? NSURLdocURL = 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 directorylet 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 consoleprintln(contents)


Swift 4.1

 func savePdf(urlString:String, fileName:String) {        DispatchQueue.main.async {            let url = URL(string: urlString)            let pdfData = try? Data.init(contentsOf: url!)            let resourceDocPath = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)).last! as URL            let pdfNameFromUrl = "YourAppName-\(fileName).pdf"            let actualPath = resourceDocPath.appendingPathComponent(pdfNameFromUrl)            do {                try pdfData?.write(to: actualPath, options: .atomic)                print("pdf successfully saved!")            } catch {                print("Pdf could not be saved")            }        }    }    func showSavedPdf(url:String, fileName:String) {        if #available(iOS 10.0, *) {            do {                let docURL = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)                let contents = try FileManager.default.contentsOfDirectory(at: docURL, includingPropertiesForKeys: [.fileResourceTypeKey], options: .skipsHiddenFiles)                for url in contents {                    if url.description.contains("\(fileName).pdf") {                       // its your file! do what you want with it!                }            }        } catch {            print("could not locate pdf file !!!!!!!")        }    }}// check to avoid saving a file multiple timesfunc pdfFileAlreadySaved(url:String, fileName:String)-> Bool {    var status = false    if #available(iOS 10.0, *) {        do {            let docURL = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)            let contents = try FileManager.default.contentsOfDirectory(at: docURL, includingPropertiesForKeys: [.fileResourceTypeKey], options: .skipsHiddenFiles)            for url in contents {                if url.description.contains("YourAppName-\(fileName).pdf") {                    status = true                }            }        } catch {            print("could not locate pdf file !!!!!!!")        }    }    return status}


I am giving an example of storing and retrieving a pdf document in iOS. I hope that is what you are looking for.

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 ?

// the URL to saveNSURL *yourURL = [NSURL URLWithString:@"http://yourdomain.com/yourfile.pdf"];// turn it into a request and use NSData to load its contentNSURLRequest *request = [NSURLRequest requestWithURL:result.link];NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];// find Documents directory and append your local filenameNSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];documentsURL = [documentsURL URLByAppendingPathComponent:@"localFile.pdf"];// and finally save the file[data writeToURL:documentsURL atomically:YES];

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

You can check that the file has downloaded, or you can list the Documents directory like so:

// list contents of Documents Directory just to checkNSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];NSArray *contents = [[NSFileManager defaultManager]contentsOfDirectoryAtURL:documentsURL includingPropertiesForKeys:nil options:NSDirectoryEnumerationSkipsHiddenFiles error:nil];NSLog(@"%@", [contents description]);