我有一个PDF,我从一个以NSData形式出现的服务器中拉出来,现在我需要显示它。我已经远远地看到了解决这个问题的方法,我没有找到任何能够弥补原始NSData与实际保存或显示PDF之间差距的东西。
我尝试了这个,但现在我不知道如何保存或显示:
let cfData = CFDataCreate(kCFAllocatorDefault, UnsafePointer<UInt8>(data.bytes), data.length)
let cgDataProvider = CGDataProviderCreateWithCFData(cfData)
let cgPDFDocument = CGPDFDocumentCreateWithProvider(cgDataProvider)
答案 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从URL
或Data
实例加载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)
更新
将文件保存到文档目录。
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]
在这里,您可以在前面附加反斜杠附加文件名。 你可以测试你的文件是否存在。