如何在Swift中显示来自NSData的PDF - 如何将PDF保存到文档文件夹Swift - 如何在Swift中通过WebView从保存的NSData中显示PDF

时间:2016-08-05 15:06:18

标签: swift pdf

我有一个PDF,我从一个以NSData形式出现的服务器中拉出来,现在我需要显示它。我已经远远地看到了解决这个问题的方法,我没有找到任何能够弥补原始NSData与实际保存或显示PDF之间差距的东西。

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

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

3 个答案:

答案 0 :(得分:15)

首先,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))

显然,这是确保您掌握基础知识的快速方法,您不希望使用!强制解包。

答案 1 :(得分:5)

从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了解详情。

答案 2 :(得分:2)

更新

  • Xcode 8.1
  • Swift 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]

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