无法从 Swift 中的文档目录加载 pdf



我从远程服务器下载了一个pdf并将其保存在文档目录中。现在我正在尝试检索它并在 webView 中显示 pdf,但我不断收到此异常:

找不到 PDF 页眉:"%PDF"未找到。

在此异常之前,它还显示此异常:

objc[8087]:类PLBuildVersion在/Applications/Xcode.app/Content/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/AssetsLibraryServices.framework/

AssetsLibraryServices (0x11f29dcc0(和/Applications/Xcode.app/Content/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。而且我已经检查了此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中可用的文件",但仍有此异常。

使用以下代码在 Web 视图中加载 PDF

斯威夫特 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文件存储在文档目录中的位置是路径。

/

文档/斯威夫特.pdf

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

  1. 创建新项目。
  2. 将 1 个样本 PDF 拖到捆绑包"sample.pdf"中
  3. 并通过以下方式更改您的控制器代码
  4. 就是这样运行

导入 UIKit

类视图控制器: 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.
}

}

只需使用

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")
}

最新更新