【问题标题】:How to show PDF from NSData in Swift - how to save PDF to documents folder Swift - how to display PDF from saved NSData via WebView in Swift如何在 Swift 中从 NSData 显示 PDF - 如何将 PDF 保存到文档文件夹 Swift - 如何在 Swift 中通过 WebView 从保存的 NSData 显示 PDF
【发布时间】:2016-08-05 15:06:17
【问题描述】:

我有一个 PDF,我从以 NSData 形式出现的服务器中提取,现在我需要显示它。我已经广泛寻找解决方案,但我还没有找到任何可以弥合原始 NSData 和实际保存或显示 PDF 之间差距的东西。

我试过了,但现在我不知道如何保存或显示:

let cfData = CFDataCreate(kCFAllocatorDefault, UnsafePointer<UInt8>(data.bytes), data.length)                                                
let cgDataProvider = CGDataProviderCreateWithCFData(cfData)
let cgPDFDocument = CGPDFDocumentCreateWithProvider(cgDataProvider)

【问题讨论】:

标签: swift pdf


【解决方案1】:

首先,NSData IS 您的 PDF,目前无需转换为另一种数据类型或使用库来操作它。

现在,只需将 NSData 保存到 iOS 上的文档目录即可,它不是像 CoreData 或 Realm 那样的托管持久存储,也不是 UserDefaults。这是一个文件夹,里面有东西。

保存到文档文件夹:

let data = //the stuff from your web request or other method of getting pdf    
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
let filePath = "\(documentsPath)/myCoolPDF.pdf"
data.writeToFile(filePath, atomically: true)

现在验证文件是否存在并在您的 Mac 上打开它。这是为了确保您保存的是实际的 PDF 而不是其他任何内容。这是一个两步过程。首先通过从 iOS 模拟器打印文档文件夹的位置来找出文件到底去了哪里:

let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
let documentsDirectory = paths[0]
print(documentsDirectory)

现在复制那个很长的文件路径和终端中的cd [paste location] 去那里,然后open myCoolPDF.pdf 在预览中打开它!这是神奇的时代!

现在您已经验证了您正在处理的是一个实际的 PDF,是时候在 WebView 中显示它了,因为它非常简单,除非您有自己的方法。

请注意,您仍然必须制作它以便显示 webview,将一个拖到情节提要中的 viewController 上并为其创建一个 IBOutlet。

let url = NSURL(fileURLWithPath: filePath)
let webView = UIWebView()
webView.loadRequest(NSURLRequest(URL: url))

显然,这是确保您掌握基本知识的一种快速方法,您不想使用 ! 强制不安全地展开。

【讨论】:

  • 如果这是一个问答,以供将来参考,请尽量不要使不必要的事情复杂化。 NSURL(string: "file://" + urlStringPDF!)! 的结果正是您在 url 变量中已有的结果。这使得大部分“重要”部分过时了。 – 也使用URLByAppendingPathComponent 代替字符串连接来构建文件路径。
  • file:// 在我使用 .path 从 URL 获取字符串的方法时被剥离,在我的实现中,我将字符串传递给另一个上下文中的 webview跨度>
  • true 在这种情况下您可能不需要附加file://
  • filePath 是一个字符串,url 是对应的 URL,到目前为止一切顺利。然后let urlStringPDF = url.path 再次给你filePathNSURL(string: "file://" + urlStringPDF!)! 再次给你url。不需要最后两次转换。
  • 已编辑,如果您不赞成,请调整投票
【解决方案2】:

从 iOS 11 开始,您不需要 Web 视图,并且可以使用专用的 PDFKit 框架。使用 PDFKit 从 URLData 实例加载 PDF 可以很简单:

import PDFKit

// some other code here
// ...

let pdfView = PDFView()

// add pdfView to the view hierarchy and possibly add auto-layout constraints
// ...

pdfView.document = PDFDocument(data: data)

查看PDFKit documentation了解更多详情。

【讨论】:

    【解决方案3】:

    更新:

    • Xcode 8.1
    • 斯威夫特 3.0.1

    用于将文件保存到文档目录。

    let documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
    let path = "\(documentPath)/filename.pdf"
    yourData.write(toFile: path, atomically: true)
    

    用于检索文档目录的路径。

    let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
    let documentsDirectory = paths[0]
    

    在这里,您可以在文件名前附加反斜杠。 并且你可以测试你的文件是否存在那里。

    【讨论】:

      猜你喜欢
      • 2018-11-19
      • 2015-06-11
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      相关资源
      最近更新 更多