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

Posted

技术标签:

【中文标题】如何在 Swift 中从 NSData 显示 PDF - 如何将 PDF 保存到文档文件夹 Swift - 如何在 Swift 中通过 WebView 从保存的 NSData 显示 PDF【英文标题】: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 【发布时间】: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)

【问题讨论】:

你可以看看这个:- ***.com/a/53393855/5857254 你可以看看这个:- ***.com/a/53393855/5857254 【参考方案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]

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

【讨论】:

以上是关于如何在 Swift 中从 NSData 显示 PDF - 如何将 PDF 保存到文档文件夹 Swift - 如何在 Swift 中通过 WebView 从保存的 NSData 显示 PDF的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中从 NSString 创建 NSData

在Swift中从NSString创建NSData

在 Swift 中从 HTML 生成带有图像的 PDF 而不显示打印界面

在 Swift 中正确地将 -Hex- NSData 形式的 4 个字节读入其正确的数据类型(float 或 int)

在 NSURLConnection 中的 Swift 中从 completionHandler 中获取数据

如何在 Swift 3 中将 NSData 转换为数据?