【问题标题】:Open PDF file using swift使用 swift 打开 PDF 文件
【发布时间】:2015-01-09 02:51:09
【问题描述】:

如何为应用添加 PDF 文件,您可以在其中单击按钮查看文件并在完成后返回您所在的屏幕?

【问题讨论】:

    标签: ios iphone swift


    【解决方案1】:

    如果您只是想查看 PDF 文件,可以将其加载到 UIWebView。

    let url : NSURL! = NSURL(string: "http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIWebView_Class/UIWebView_Class.pdf")
    webView.loadRequest(NSURLRequest(URL: url))
    

    Swift 4.1:

    let url: URL! = URL(string: "http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIWebView_Class/UIWebView_Class.pdf")
    webView.loadRequest(URLRequest(url: url))
    

    如果您想实现更多,一个好的框架是PSPDFKit

    【讨论】:

    • UIWebView 可以加载本地 PDF。而是使用 [NSURL fileURLWithPath:strURLPath]; 。 .该路径将是您的文档目录或资源包。 . UIWebView 上还有一个加载数据的方法,所以你可以给它一个 NSData 对象。 (不过,从文件流式传输可能更适合内存使用)。
    • 如果在资源目录中:stackoverflow.com/questions/6398937/…(文档目录的类似故事)。 . .从字符串构建 NSURL。
    • Jasper 推荐的 PSPDFKit 是免费的吗?
    • 没试过,听说很流行。在网站上看起来像是付费产品,但实际价格并不清楚!
    • 从 iOS 8.0 和 OS X 10.10 开始,使用 WKWebView 将 Web 内容添加到您的应用程序。不要使用 UIWebView 或 WebView。
    【解决方案2】:

    您可以使用 UIDocumentInteractionController 在 IOS 中预览文件。 在视图控制器的文件中,添加 UIDocumentInteractionController 类型的属性

    并实现它的简单委托方法

    self.documentInteractionController = UIDocumentInteractionController.init(URL: url)
    self.documentInteractionController?.delegate = self
    self.documentInteractionController?.presentPreviewAnimated(t‌​rue) 
    
    func documentInteractionControllerViewControllerForPreview(controller: UIDocumentInteractionController) -> UIViewController {
        return self
    }
    

    不要忘记在视图控制器的类中添加UIDocumentInteractionControllerDelegate

    【讨论】:

    • self.documentInteractionController = UIDocumentInteractionController.init(URL: url) self.documentInteractionController?.delegate = self self.documentInteractionController?.presentPreviewAnimated(true)
    • 这种情况下没用。 “预览”应该用于预览 - 在小视图中,但不能用于“打开” pdf。
    【解决方案3】:

    适用于 Xcode 8.1 和 Swift 3.0

    将 PDF 文件保存在 xcode 的任何文件夹中。 假设文件名是'Filename.pdf'

    if let pdf = Bundle.main.url(forResource: "Filename", withExtension: "pdf", subdirectory: nil, localization: nil)  {
        let req = NSURLRequest(url: pdf)
        yourWebViewOutletName.loadRequest(req as URLRequest)        
    }
    

    如果您想打开任何 html 文件,同样适用。

    【讨论】:

      【解决方案4】:

      您也可以使用 Apple 的 Quick Look Framework。

      它非常灵活。

      您可以使用缩放功能显示您的 PDF 文件。

      您还支持所有其他类型的文件(如 png、jpg、docx、txt、rtf、xlsx、zip、mov 等),并且非常易于使用。

      请参考 this 回答如果你想详细描述使用 QuickLook.framework

      【讨论】:

        【解决方案5】:
        let openLink = NSURL(string : OtherContactorProfileVview.Result.CertificateList[index].CertificateFileLink)
        
        if #available(iOS 9.0, *) {
            let svc = SFSafariViewController(url: openLink! as URL)
            present(svc, animated: true, completion: nil)
        } else {
            let port = UIStoryboard(
                name: "Main",
                bundle: nil
            ).instantiateViewController(withIdentifier: "PDFViewer") as! PDFViewer
            port.strUrl = OtherContactorProfileVview.Result.CertificateList[index].CertificateFileLink
            navigationController?.pushViewController(port, animated: true)
        }
        

        【讨论】:

          【解决方案6】:

          SWIFT 4+

          如果必须从具有文件路径的本地缓存/文档目录中打开文件

          方法一:使用 UIDocumentInteractionController

          class ViewController: UIViewController,UIDocumentInteractionControllerDelegate {
             //let path =  Bundle.main.path(forResource: "Guide", ofType: ".pdf")!
              let dc = UIDocumentInteractionController(url: URL(fileURLWithPath: path))
              dc.delegate = self
              dc.presentPreview(animated: true)
          }
          
          //MARK: UIDocumentInteractionController delegates
          func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController {
              return self//or use return self.navigationController for fetching app navigation bar colour
          }
          

          方法二:使用WebView

          let webview = WKWebView(frame: UIScreen.main.bounds)
          view.addSubview(webview)
          webview.navigationDelegate = self
          webview.load(URLRequest(url: URL(fileURLWithPath: path)))//URL(string: "http://") for web URL
          

          【讨论】:

          • 您可以与 iBook 共享
          【解决方案7】:

          Apple 在iOS 11 中添加了PDFKit 框架

          将 UIView 添加到您的视图控制器并使其成为 PDFView 的类

          import UIKit
          import PDFKit
          
          class ViewController: UIViewController {
          
              @IBOutlet var pdfView: PDFView!
          
              override func viewDidLoad() {
                  super.viewDidLoad()
          
                  if let path = Bundle.main.path(forResource: "sample", ofType: "pdf") {
                      if let pdfDocument = PDFDocument(url: URL(fileURLWithPath: path)) {
                          pdfView.displayMode = .singlePageContinuous
                          pdfView.autoScales = true
                          pdfView.displayDirection = .vertical
                          pdfView.document = pdfDocument
                      }
                  }
              }
          }
          

          有4种显示模式:singlePagesinglePageContinuoustwoUptwoUpContinuous

          【讨论】:

          • Xcode 10.2 内部出错,需要将方法放入 viewDidAppear()
          【解决方案8】:

          您可以在 Swift 4 中使用此代码

          1. 导入 PDFKit
          2. 复制这段代码

            let pdfView = PDFView()        
            pdfView.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview(pdfView)
            
            pdfView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
            pdfView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
            pdfView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
            pdfView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
            
            guard let path = Bundle.main.url(forResource: "test", withExtension: "pdf") else { return }
            
            if let document = PDFDocument(url: path) {
                pdfView.document = document
            }
            

          【讨论】:

          • 文档打开后如何关闭?
          【解决方案9】:

          从 IOS11 查看PDFKit

          这是一个从 PDFKit 实现 PDFView 的视图控制器示例。

          import UIKit
          import PDFKit
          
          class ViewController: UIViewController {
          
              override func viewDidLoad() {
                  super.viewDidLoad()
          
                  // Add PDFView to view controller.
                  let pdfView = PDFView(frame: self.view.bounds)
                  self.view.addSubview(pdfView)
          
                  // Fit content in PDFView.
                  pdfView.autoScales = true
          
                  // Load Sample.pdf file.
                  let fileURL = Bundle.main.url(forResource: "Sample", withExtension: "pdf")
                  pdfView.document = PDFDocument(url: fileURL!)
              }
          
          }
          

          【讨论】:

            【解决方案10】:

            SWIFT 5

            Document 目录(设备)打开文件并呈现预览的更新:

            let urlFile = URL(string: pathToFile)
            var documentInteractionController: UIDocumentInteractionController!    
            documentInteractionController = UIDocumentInteractionController.init(url: urlFile!)
            documentInteractionController?.delegate = self
            documentInteractionController?.presentPreview(animated: true)
            

            还有 UIDocumentInteractionControllerDelegate:

            extension ViewController: UIDocumentInteractionControllerDelegate {
                func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController {
                    return self
                }
            }
            

            如果您想关闭文档预览,您可以使用:

            documentInteractionController?.dismissPreview(animated: true)
            

            【讨论】:

              【解决方案11】:

              Akila 答案的现代化版本,它的好处是可以直接使用 UIViewController,您可以将其集成到您的应用中。

              import UIKit
              import PDFKit
              
              final class PDFViewController: UIViewController {
                  override func viewDidLoad() {
                      super.viewDidLoad()
              
                      let pdfView = PDFView(frame: view.frame)
                      
                      title = "Your_title_here"
                      
                      if let url = Bundle.main.url(forResource: "document_name_here", withExtension: "pdf"),
                          let pdfDocument = PDFDocument(url: url) {
                          pdfView.displayMode = .singlePageContinuous
                          pdfView.autoScales = true
                          pdfView.displayDirection = .vertical
                          pdfView.document = pdfDocument
                          
                          view.addSubview(pdfView)
                      }
                  }
              }
              
              • 它在viewDidLoad 期间创建PDFView 并将其设置为使用视图的框架
              • PDF 文件的URL 已从捆绑包中安全解包,然后如果可能,将创建PDFDocument
              • 使用了一些常用设置。根据需要调整
              • 最后,它将PDFView 添加为控制器view 的子视图

              【讨论】:

                【解决方案12】:

                //在 Swift 5 中

                    class PDFBookViewController: UIViewController, PDFViewDelegate {
                    
                    override func viewDidLoad() {
                        super.viewDidLoad()
                        addPDFView()  
                    }
                    
                    private func addPDFView() {
                        let pdfView = PDFView()
                        pdfView.translatesAutoresizingMaskIntoConstraints = false
                        pdfContenerView.addSubview(pdfView)
                    
                        pdfView.leadingAnchor.constraint(equalTo: pdfContenerView.safeAreaLayoutGuide.leadingAnchor).isActive = true
                        pdfView.trailingAnchor.constraint(equalTo: pdfContenerView.safeAreaLayoutGuide.trailingAnchor).isActive = true
                        pdfView.topAnchor.constraint(equalTo: pdfContenerView.safeAreaLayoutGuide.topAnchor).isActive = true
                        pdfView.bottomAnchor.constraint(equalTo: pdfContenerView.safeAreaLayoutGuide.bottomAnchor).isActive = true
                        
                        pdfView.autoScales = true
                        pdfView.displayMode = .singlePageContinuous
                        pdfView.displayDirection = .vertical
                        
                        ///Open pdf with help of FileManager URL
                        if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
                            let bookWithPdf = "\(bookname).pdf"
                            let fileURL = dir.appendingPathComponent(bookWithPdf)
                            let document = PDFDocument(url: fileURL)
                            pdfView.document = document
                        } 
                  @IBAction func backButtonPressed(_ sender: Any) {
                            navigationController?.popViewController(animated: true)
                        } 
                }
                

                【讨论】:

                  【解决方案13】:

                  您可以使用此UIViewController。它免费包含share button

                  import UIKit
                  import PDFKit
                  
                  class PDFWebViewController: UIViewController {
                      var pdfURL: URL!
                      
                      private var pdfView: PDFView!
                      
                      override func viewDidLoad() {
                          super.viewDidLoad()
                          self.edgesForExtendedLayout = []
                                  
                          self.setPDFView()
                          self.fetchPDF()
                      }
                      
                      private func setPDFView() {
                          DispatchQueue.main.async {
                              self.pdfView = PDFView(frame: self.view.bounds)
                              
                              self.pdfView.maxScaleFactor = 3;
                              self.pdfView.minScaleFactor = self.pdfView.scaleFactorForSizeToFit;
                              self.pdfView.autoScales = true;
                              self.pdfView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
                              
                              self.view.addSubview(self.pdfView)
                          }
                      }
                      
                      private func fetchPDF() {
                          DispatchQueue.global(qos: .userInitiated).async {
                              if let data = try? Data(contentsOf: self.pdfURL), let document = PDFDocument(data: data) {
                                  DispatchQueue.main.async {
                                      self.pdfView.document = document
                                      self.addShareBarButton()
                                  }
                              }
                          }
                      }
                      
                      private func addShareBarButton() {
                          let barButtonItem = UIBarButtonItem(barButtonSystemItem: .action,
                                                              target: self,
                                                              action: #selector(self.presentShare))
                          barButtonItem.tintColor = .white
                          self.navigationItem.rightBarButtonItem = barButtonItem
                      }
                      
                      @objc private func presentShare() {
                          guard let pdfDocument = self.pdfView.document?.dataRepresentation() else { return }
                          
                          let activityViewController = UIActivityViewController(activityItems: [pdfDocument], applicationActivities: nil)
                          activityViewController.popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem
                          
                          self.present(activityViewController, animated: true)
                      }
                  }
                  

                  使用它:

                  let viewController = PDFWebViewController()
                  
                  // the url can be a web url or a file url
                  viewController.pdfURL = url
                          
                  self.navigationController?.pushViewController(viewController, animated: true)
                  

                  【讨论】:

                    猜你喜欢
                    • 2017-03-26
                    • 2019-09-24
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-03-10
                    • 1970-01-01
                    • 2021-05-01
                    相关资源
                    最近更新 更多