【问题标题】:How to load a PDF from a Base64 string in a UIWebView如何从 UIWebView 中的 Base64 字符串加载 PDF
【发布时间】:2017-05-11 15:51:30
【问题描述】:

我正在使用返回 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?有没有更好的方法来做到这一点?

【问题讨论】:

  • 您是在本地保存检索到的数据还是只想显示来自 API 的数据响应?
  • 尝试传递"http://localhost/"

标签: ios swift pdf swift3 uiwebview


【解决方案1】:

我解决了这个问题,尽管我不确定这是否是一个好方法,但解决方案是将任何有效的 URL 放入 baseUrl:

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

【讨论】:

  • 你能帮帮我吗?这段代码对我不起作用。也许我在某个地方犯了一个错误
  • 事实上,几年后,当 Apple 弃用 UIWebView 时,我对 WKWebView 也有同样的奇怪行为。当我试图呈现本地创建的 PDF 文件时,我尝试了一些对我没有意义的东西,因此添加有效的 URL 使其工作。奇怪...
【解决方案2】:

试试这个

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

【讨论】:

    【解决方案3】:

    先将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: ""))
    }
    

    【讨论】:

      【解决方案4】:

      对于 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
      }
      

      【讨论】:

        【解决方案5】:

        斯威夫特 5+ 非常简单流畅的解决方案

        let base64PDF = "m5hbWVfaWQiOiJ1aWQiLCJRSUQiOiIyNzg1ODYwNDM3NSIsIlVVSUQiOiIwMDE2M0U2Ri1EREMyLTFFRTktQUE5MS0wOEYxMDFEODU4NTYiLCJFbWFpbCI6IlNBSUYuUkVITUFOQEFBQlFBVEFSLkNPTSIs"
        if let data = Data(base64Encoded: base64PDF, options: Data.Base64DecodingOptions.ignoreUnknownCharacters) as Data? {
            self.webKitView.load(data, mimeType: "application/pdf", characterEncodingName: "", baseURL: nil)
        }
        

        【讨论】:

        • 解决方案有效,我想知道优化方式,我上传了它。
        猜你喜欢
        • 2016-04-14
        • 1970-01-01
        • 1970-01-01
        • 2013-08-18
        • 1970-01-01
        • 1970-01-01
        • 2020-01-21
        • 1970-01-01
        • 2018-06-29
        相关资源
        最近更新 更多