How to download PDF and store it locally on iPhone?

前端 未结 7 1273
时光说笑
时光说笑 2020-11-30 19:51

I am able to successfully view a PDF from a website. I want to be able to download that PDF to the device, then access that file locally.

When the app is opened, it

相关标签:
7条回答
  • 2020-11-30 20:27

    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 :)

    0 讨论(0)
  • 2020-11-30 20:28

    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!

    0 讨论(0)
  • 2020-11-30 20:28

    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.

    0 讨论(0)
  • 2020-11-30 20:38

    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)
    
        }
    
    0 讨论(0)
  • 2020-11-30 20:39

    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()
    
    0 讨论(0)
  • 2020-11-30 20:42

    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.

    0 讨论(0)
提交回复
热议问题