无法从Swift

时间:2017-07-03 11:19:15

标签: ios swift pdf webview nsdocumentdirectory

我从远程服务器下载了pdf并将其保存在文档目录中。现在我试图检索它并在webView中显示pdf,但我一直得到这个例外:

  

找不到PDF标题:`%PDF'没找到。

在此异常之前它也显示此异常:

  

objc [8087]:类PLBuildVersion在/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/AssetsLibraryServices.framework/AssetsLibraryServices中实现(0x11f29dcc0)和/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/PhotoLibraryServices.framework/PhotoLibraryServices(0x11f0b46f0)。

     

将使用其中一个。哪一个未定义。

但是我注意到当我尝试从移动设备而不是模拟器运行时,第二个异常就消失了。以下是我获取它的代码:

    let check:String =  FileNames[0] + ".pdf"
      print("check = \(check)")
 // Method 1
        let docURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
        let targetURL = docURL.appendingPathComponent(check)

        var request = URLRequest(url: targetURL)
        webView.loadRequest(request)

    /*
           // Method 2
       var pdfURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! as URL
        pdfURL = pdfURL.appendingPathComponent(check) as URL
        print("check url = \(pdfURL)")
        let data = try! Data(contentsOf: pdfURL)
        print("check data = \(data)")
        webView.load(data, mimeType: "application/pdf", textEncodingName:"utf-8", baseURL: pdfURL) // pdfURL.deletingLastPathComponent()
      */

        //let requestk = NSURLRequest(url: pdfURL as URL)
       // webView.loadRequest(requestk as URLRequest)


         // Method 3

      /*  let fileManager = FileManager.default
        let documentsUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL

        var pdf = documentsUrl.appendingPathComponent(check)
        print("check item fetching from documentsUrl = \(pdf)")
        let req = NSURLRequest(url: pdf!)
        self.webView.loadRequest(req as URLRequest)
      */  

我已经搜索了很多关于这个异常并且遵循了所有可能的解决方案,但没有一个能够正常工作。但是如果我尝试直接从远程服务器的地址显示这个pdf,它就会显示出来。而且我还检查了这个pdf是否正确存储。我尝试用数据方法加载webView.loadRequest和webView.load,也许我错过了一些小东西。

更新

  var pdfURL = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)).last! as URL
        print("check final = \(pdfURL)")
        pdfURL = pdfURL.appendingPathComponent(check) as URL

        do{
            let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
            let url = URL(fileURLWithPath: path)
            var filePath = url.appendingPathComponent(check).path
            let fileManager1 = FileManager.default
            if fileManager1.fileExists(atPath: filePath) {
                print("FILE AVAILABLE in VC")
              // let fileUrlkk = NSURL(string: filePath)// converting string into URL

                filePath = "file://\(filePath)"

                let fileUrlkk = Foundation.URL(string: filePath)
                let data = try Data(contentsOf: fileUrlkk!)

               //  let data = try Data(contentsOf: pdfURL) // tried but didn’t work


                self.webView.load(data, mimeType: "application/pdf", textEncodingName:"", baseURL: pdfURL.deletingLastPathComponent())                   

            } else {
                print("FILE NOT AVAILABLE in VC")
            }
        }
        catch let error as NSError {
            print("An error took place: \(error)")
        }

它显示" VC中提供的文件"但仍然有这个例外。

2 个答案:

答案 0 :(得分:5)

使用以下代码在WebView中加载PDF

Swift 3.0

var pdfURL = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)).last! as URL
pdfURL = pdfURL.appendingPathComponent("Swift.pdf") as URL

let data = try! Data(contentsOf: pdfURL)
self.webView.load(data, mimeType: "application/pdf", textEncodingName:"", baseURL: pdfURL.deletingLastPathComponent())

此处文档目录中的pdf文件存储是路径。

  

/Documents/Swift.pdf

-----更新------

  1. 创建新项目。
  2. 在包“sample.pdf”
  3. 中拖动1个样本PDF
  4. 并使用以下
  5. 更改您的控制器代码
  6. 它运行
  7. 导入UIKit

    类ViewController:UIViewController {

    @IBOutlet weak var webView: UIWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        let check = "Swift.pdf"
    
        var pdfURL = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)).last! as URL
        print("check final = \(pdfURL)")
        pdfURL = pdfURL.appendingPathComponent(check) as URL
    
        if let pdfBundleURL = Bundle.main.url(forResource: "sample", withExtension: "pdf", subdirectory: nil, localization: nil)  {
            do {
                let data = try Data(contentsOf: pdfBundleURL)
    
                //Lastly, write your file to the disk.
                try data.write(to: pdfURL, options: .atomicWrite)
    
            }
            catch {
                // catch errors here
            }
        }
    
        do{
            let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
            let url = URL(fileURLWithPath: path)
            var filePath = url.appendingPathComponent(check).path
            let fileManager1 = FileManager.default
            if fileManager1.fileExists(atPath: filePath) {
                print("FILE AVAILABLE in VC")
                // let fileUrlkk = NSURL(string: filePath)// converting string into URL
    
                filePath = "file://\(filePath)"
    
                let fileUrlkk = Foundation.URL(string: filePath)
                let data = try Data(contentsOf: fileUrlkk!)
    
                //  let data = try Data(contentsOf: pdfURL) // tried but didn’t work
    
    
                self.webView.load(data, mimeType: "application/pdf", textEncodingName:"", baseURL: pdfURL.deletingLastPathComponent())
    
            } else {
                print("FILE NOT AVAILABLE in VC")
            }
        }
        catch let error as NSError {
            print("An error took place: \(error)")
        }
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    

    }

答案 1 :(得分:0)

只需使用

do{
  let directoryURL = try manager.url(for:.documentDirectory,in:.userDomainMask, appropriateFor:nil, create:true)

let docURL = NSURL(string:"XXX.pdf", relativeTo:directoryURL)
    }
catch{print("ERROR")
}