如何从UIWebView中的Base64字符串加载PDF

时间:2017-05-11 15:51:30

标签: ios swift pdf swift3 uiwebview

我正在使用返回Base64字符串的API,如下所示:

data:application/pdf;base64,**BASE64STRING**

BASE64STRING是我需要显示PDF的地方。

到目前为止,我只创建了一个获取Base64字符串的Data对象:

let data = Data(base64Encoded: BASE64STRING)

我尝试在webview中加载它:

webView.load(data!, mimeType: "application/pdf", textEncodingName: "", baseURL: URL(string: "")!)

问题是我没有本地PDF文件,因此我不知道应该在baseURL中放置什么。目前它正在给我fatal error: unexpectedly found nil while unwrapping an Optional value

如何在webView中加载PDF?有没有更好的方法呢?

3 个答案:

答案 0 :(得分:0)

试试这个

webView.load(data, mimeType: "application/pdf", textEncodingName: "utf-8", baseURL: URL(fileURLWithPath: ""))

答案 1 :(得分:0)

首先将base64String转换为NSData,然后转换为Data并使用它。

PDF文件是二进制文件,因此不能直接表示为UITF8编码的字符串。

if let data = NSData(base64Encoded: base64String, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters) as Data? {
    self.webView.load(data, mimeType: "application/pdf", characterEncodingName: "", baseURL: URL(fileURLWithPath: ""))
}

答案 2 :(得分:0)

对于 Swift 5,这里是一个没有强制解包和临时文件的完整示例:

guard let data = Data(base64Encoded: base64), let fileUrl = try? saveTemporaryFile(from: data, filename: fileName) else {
    // error handling
    return
}

webView.load(data, mimeType: "application/pdf", textEncodingName: "", baseURL: fileUrl)
    

以及将数据保存在本地临时文件中的实用函数:

func saveTemporaryFile(from data: Data, filename: String? = nil) throws -> URL {
    let filename = filename ?? UUID().uuidString
    let fileURL = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true).appendingPathComponent(filename)
    try? FileManager.default.removeItem(at: fileURL)
    try data.write(to: fileURL)

    return fileURL
}