如何在iOS中显示来自网络的pdf

时间:2017-11-06 16:59:55

标签: ios swift xcode quicklook

目前我正在使用QuickLook模块从网络打开pdf,但它在控制台中显示错误“无法为url:https://testing-xamidea.s3.amazonaws.com/flowchart/20171103182728150973368.pdf发出文件扩展名”的空白页面。我猜QuickLook只能打开本地保存的Pdf文件。是否可以使用quicklook从网络加载pdf? 。这是我的代码到目前为止 - {fileURL包含要从中加载pdf的url,我也设置了委托等)

extension FlowchartVC:QLPreviewControllerDelegate,QLPreviewControllerDataSource {
func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
return 1
 }  
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {

let url : NSURL! = NSURL(string : fileURL)
return url
 }
   func previewControllerWillDismiss(_ controller: QLPreviewController) {
 self.dismiss(animated: true, completion: nil)
 }
}

1 个答案:

答案 0 :(得分:6)

您需要先将文件保存到磁盘,然后才能显示pdf。如果文件位于远程位置,则无法使用QuickLook呈现它。该文件保存在临时目录中。这是一个示例视图控制器,显示它是如何完成的。

Swift 5:

import UIKit
import QuickLook

class ViewController: UIViewController, QLPreviewControllerDataSource {
    // Remote url pdf I found on google
    let itemURL = URL(string: "https://www.ets.org/Media/Tests/GRE/pdf/gre_research_validity_data.pdf")!
    var fileURL: URL?

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        let quickLookController = QLPreviewController()
        quickLookController.dataSource = self

        do {
            // Download the pdf and get it as data
            // This should probably be done in the background so we don't
            // freeze the app. Done inline here for simplicity
            let data = try Data(contentsOf: itemURL)

            // Give the file a name and append it to the file path
            fileURL = FileManager().temporaryDirectory.appendingPathComponent("sample.pdf")
            if let fileUrl = fileURL {
                // Write the pdf to disk in the temp directory
                try data.write(to: fileUrl, options: .atomic)
            }

            // Make sure the file can be opened and then present the pdf
            if QLPreviewController.canPreview(itemURL as QLPreviewItem) {
                quickLookController.currentPreviewItemIndex = 0
                present(quickLookController, animated: true, completion: nil)
            }
        } catch {
            // cant find the url resource
        }
    }

    func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
        return 1
    }

    func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
        return fileURL! as QLPreviewItem
    }
}

斯威夫特3:

import UIKit
import QuickLook

class ViewController: UIViewController, QLPreviewControllerDataSource {
    // Remote url pdf I found on google
    let itemURL = URL(string: "https://www.ets.org/Media/Tests/GRE/pdf/gre_research_validity_data.pdf")!
    var fileURL = URL(string: "")

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        let quickLookController = QLPreviewController()
        quickLookController.dataSource = self

        do {
            // Download the pdf and get it as data
            // This should probably be done in the background so we don't
            // freeze the app. Done inline here for simplicity
            let data = Data(contentsOf: itemURL)

            // Give the file a name and append it to the file path
            fileURL = FileManager().temporaryDirectory.appendingPathComponent("sample.pdf")
            // Write the pdf to disk
            try data?.write(to: fileURL!, options: .atomic)

            // Make sure the file can be opened and then present the pdf
            if QLPreviewController.canPreview(itemURL as QLPreviewItem) {
                quickLookController.currentPreviewItemIndex = 0
                present(quickLookController, animated: true, completion: nil)
            }
        } catch {
            // cant find the url resource
        }
    }

    func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
        return 1
    }

    func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
        return fileURL! as QLPreviewItem
    }
}

这是模拟器中显示的文件。使用仅包含该代码的示例项目。

enter image description here