How to download PDF and store it locally on iPhone?

心不动则不痛 提交于 2019-11-27 10:34:37
RVN

I have found one method which I tried myself:

// Get the PDF Data from the url in a NSData Object
NSData *pdfData = [[NSData alloc] initWithContentsOfURL:[
    NSURL URLWithString:@"http://www.example.com/info.pdf"]];

// Store the Data locally as PDF File
NSString *resourceDocPath = [[NSString alloc] initWithString:[
    [[[NSBundle mainBundle] resourcePath] stringByDeletingLastPathComponent]
        stringByAppendingPathComponent:@"Documents"
]];

NSString *filePath = [resourceDocPath 
    stringByAppendingPathComponent:@"myPDF.pdf"];
[pdfData writeToFile:filePath atomically:YES];


// Now create Request for the file that was saved in your documents folder
NSURL *url = [NSURL fileURLWithPath:filePath];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];

[webView setUserInteractionEnabled:YES];
[webView setDelegate:self];
[webView loadRequest:requestObj];

This will store your PDF locally and load it into your UIWebView.

In Swift 4.1

// Url in String format
let urlStr = "http://www.msy.com.au/Parts/PARTS.pdf"

// Converting string to URL Object
let url = URL(string: urlStr)

// Get the PDF Data form the Url in a Data Object
let pdfData = try? Data.init(contentsOf: url!)

// Get the Document Directory path of the Application
let resourceDocPath = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)).last! as URL

// Split the url into a string Array by separator "/" to get the pdf name
let pdfNameFromUrlArr = urlStr.components(separatedBy: "/")

// Appending the Document Directory path with the pdf name
let actualPath = resourceDocPath.appendingPathComponent(pdfNameFromUrlArr[
    pdfNameFromUrlArr.count - 1])

// Writing the PDF file data to the Document Directory Path
do {
    _ = try pdfData.write(to: actualPath, options: .atomic) 
}catch{

    print("Pdf can't be saved")
}

// Showing the pdf file name in a label
lblPdfName.text = pdfNameFromUrlArr[pdfNameFromUrlArr.count - 1]

// URLRequest for the PDF file saved in the Document Directory folder
let urlRequest = URLRequest(url: actualPath)

webVw.isUserInteractionEnabled = true
webVw.delegate = self
webVw.loadRequest(urlRequest)

If you want to save the Pdf's in a particular folder/directory inside Main Document Directory

let resourceDocPath = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)).last! as URL

// The New Directory/folder name
let newPath = resourceDocPath.appendingPathComponent("QMSDocuments")

// Creating the New Directory inside Documents Directory
do {
    try FileManager.default.createDirectory(atPath: newPath.path, withIntermediateDirectories: true, attributes: nil)
} catch let error as NSError {
    NSLog("Unable to create directory \(error.debugDescription)")
}

// Split the url into a string Array by separator "/" to get the pdf name
pdfNameFromUrlArr = urlStr.components(separatedBy: "/")

// Appending to the newly created directory path with the pdf name
actualPath = newPath.appendingPathComponent(pdfNameFromUrlArr[pdfNameFromUrlArr.count - 1])

Happy Coding :)

You need to read the File and Data Management Guide from Apple. It will describe which locations are available in the application sandbox for saving files locally and how to get a reference to those locations. It also has a section for reading and writing :)

Enjoy!

I'd also recommend taking a look at ASIHTTPRequest for easy file downloading.

I found a swift version for it:

let url = "http://example.com/examplePDF.pdf"
if let pdfData = NSData(contentsOfURL: url) {
    let resourceDocPath = NSHomeDirectory().stringByAppendingString("/Documents/yourPDF.pdf")
    unlink(resourceDocPath)
    pdfData.writeToFile(resourceDocPath, atomically: true)
}

Just remember to save the path file and you'll be able to fetch it whenever you need it.

Downloading and displaying PDF in Webview using Swift.

let request = URLRequest(url:  URL(string: "http://www.msy.com.au/Parts/PARTS.pdf")!)
let config = URLSessionConfiguration.default
let session =  URLSession(configuration: config)
let task = session.dataTask(with: request, completionHandler: {(data, response, error) in
    if error == nil{
        if let pdfData = data {
            let pathURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("\(filename).pdf")
            do {
                try pdfData.write(to: pathURL, options: .atomic)
            }catch{
                print("Error while writting")
            }

            DispatchQueue.main.async {
                self.webView.delegate = self
                self.webView.scalesPageToFit = true
                self.webView.loadRequest(URLRequest(url: pathURL))
            }
        }
    }else{
        print(error?.localizedDescription ?? "")
    }
}); task.resume()
sandy

With Swift version 3.0 syntax:

let url = NSURL(fileURLWithPath: "http://example.com/examplePDF.pdf")

    if let pdfData = NSData(contentsOf: url as URL) {

        let resourceDocPath = NSHomeDirectory().appending("/Documents/yourPDF.pdf")

        unlink(resourceDocPath)

        pdfData.write(toFile: resourceDocPath, atomically: true)

    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!