【问题标题】:How to display pdf on iOS如何在 iOS 上显示 pdf
【发布时间】:2012-06-08 09:00:02
【问题描述】:

我想知道是否有任何方法可以离线构建xcode iOS,以便我们可以显示本地文件中的 pdf 文件。

我现在使用的方法是通过UIWebView 显示包含 PDF URL (online) 的自定义 HTML,但如果可能,我想制作一个离线版本。

但从在线研究来看,在我看来,显示 PDF 的唯一方法是通过 UIWebView,如果确实如此,是否可以从本地资源中提取文件(例如,将文件添加到我的 xcode 资源文件夹)而不是而不是使用 PDF URL。

题外话: 哪个会是更好的选择?拉取本地文件还是使用在线 URL 获取 PDF 文件?

由于UIWebView 需要连接,因此只提取在线 URL 似乎是一个更好的选择,因为它将是最新和更新的。

非常感谢您的反馈。

编辑:快速提问,如果我使用UIDocumentInteractionController 方法或QuickLook framework 使其脱机,这意味着我必须在每次添加新的 PDF 文章时发布更新补丁(如果我'我错了)

考虑到这一点,我当场对自己的问题提出了反驳(对不起,如果你们中的任何人觉得你们在我身上浪费时间>.

我在 NSRange 函数之前为计算器上的点做过一次,所以我认为现在是将它用于这个框架应用程序的好时机。

P.S - 这个应用程序是一个组织基础项目,我是一名实习生,为他们提供基础骨架框架。

【问题讨论】:

  • 这取决于您的需要.. 如果您希望用户离线阅读 pdf。
  • 所以如果我想让它成为一个完整的离线应用程序的话,有没有一种方法可以离线显示pdf?
  • 是的,请检查答案.. 他们描述了您如何做到这一点。

标签: ios pdf uiwebview


【解决方案1】:

您可以使用 UIWebView 直接从您的包中获取 PDF,无需调用在线网络服务。

本地文件:

NSString *html = [NSString stringWithContentsOfFile:path1 encoding:NSUTF8StringEncoding error:nil];
[self.webView loadHTMLString:html baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle]bundlePath]]];

远程文件:

- (void) loadRemotePdf
    {
       CGRect rect = [[UIScreen mainScreen] bounds];
       CGSize screenSize = rect.size;
        
       UIWebView *myWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0,0,screenSize.width,screenSize.height)];
        webView.autoresizesSubviews = YES;
            webView.autoresizingMask=(UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth);

       NSURL *myUrl = [NSURL URLWithString:@"http://www.mysite.com/test.pdf"];
       NSURLRequest *myRequest = [NSURLRequest requestWithURL:myUrl];
            
       [webView loadRequest:myRequest];

       [window addSubview: myWebView];
       [myWebView release];
            
}

【讨论】:

  • 如果我错了,请纠正我,但我仍然需要访问互联网才能查看 UIWebView 对吗?您的代码背后的逻辑类似于提取本地变量文件的基本 HTML 代码。非常感谢您的帮助。如果别无选择,我认为您的解决方法非常简单直接。
  • 不!,您可以使用 UIWebView 访问本地 html 文件,无需连接到远程服务器,使用 UIWebView,您可以同时进行远程和本地文件(它是更改的路径:))
  • 要加载本地pdf(无网络连接),您可以使用此代码:stackoverflow.com/questions/2832245/…
  • AlbrahimZ,你为什么又删除了 pdf 加载代码?这就是他一直在寻找的。不加载本地 html 文件。
  • 不,不完全是,我的代码是关于在 web 视图中加载 本地 PDF 文件。他就是这么问的;)
【解决方案2】:

很多选项,这里有 3 个:

1) 加载和显示本地 pdf 文件的最简单方法是使用这样的 UIWebview:

NSString *path = [[NSBundle mainBundle] pathForResource:@"document" ofType:@"pdf"];
NSURL *targetURL = [NSURL fileURLWithPath:path];
NSURLRequest *request = [NSURLRequest requestWithURL:targetURL];
[webView loadRequest:request];

2) 您也可以使用UIDocumentInteractionController/QLPreviewController 来原生显示 PDF 文件。

3) 另一种方法是构建一个自定义 PDF 查看器,如 apples ZoomingPDFViewer example code。 (使用 UIPageViewController + CATiledLayer + UIScrollView)

【讨论】:

  • 如果我使用 UIDocumentInteractionController,这是否意味着它将是一个完全离线的基础应用程序?
  • 是的,但也带有 Webview。您也可以在 webview 中加载本地 pdf 文件。
  • 但是我不需要互联网访问来加载 web 视图吗?抱歉,如果我问的是一个愚蠢的问题,此时我有点困惑。
  • @jaydee3 自定义 PDF 查看器很整洁 :)
  • 感谢您回答我的问题!虽然你的问题更深入,也更适合我的问题,但我不得不把它交给 AlbrahimZ,因为他是第一个回答的。
【解决方案3】:

我建议您在处理 PDF 文件时使用QuickLook framework

【讨论】:

  • 你为什么在上面使用UIWebView推荐这个?
【解决方案4】:

我找到了这个网站,它是一种非常简单的方法,可以使用 iPhone 上加载的任何可用的支持 pdf 的应用程序打开 pdf。 (我更喜欢 iBooks)

simple way to present and open a pdf file

【讨论】:

    【解决方案5】:
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Yourpdf" ofType:@"pdf"];
    NSURL *targetURL = [NSURL fileURLWithPath:path];
    NSURLRequest *request = [NSURLRequest requestWithURL:targetURL];
    UIWebView *webView=[[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 300, 400)];
    [[webView scrollView] setContentOffset:CGPointMake(0,500) animated:YES];
    [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"window.scrollTo(0.0, 50.0)"]];
    [webView loadRequest:request];
    [self.view addSubview:webView];
    

    【讨论】:

    • 这是救命稻草,+1
    【解决方案6】:

    IOs 引入了一个新的工具包。它具有许多与显示 PDF 相关的专用功能。您可以在其中使用 PdfView 类从本地文件或通过 URL 显示 PDF。

    PDFKit > PDFView

    【讨论】:

      【解决方案7】:

      已经很晚了,但是 UIWebview 在加载 pdf 文件时有一些限制,它不会正确加载可编辑的 pdf。所以加载任何类型的 pdf 文件使用以下代码

      NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"pdfFileName" ofType:@"pdf"]];
      PDFView *view = [[PDFView alloc] initWithFrame:self.view.frame];
      view.document = [[PDFDocument alloc] initWithURL:url];
      [self.view addSubview:view];
      

      【讨论】:

      • 使用 UIDocumentInteractionController
      【解决方案8】:

      SWIFT 4.x

      Swift 中的 UIWebview 方法:

      //let url = URL.init(string: "https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf")! // for file in web
      let url = Bundle.main.url(forResource: "filename", withExtension: ".pdf")! // for file in bundle
      let webView = UIWebView.init(frame: view.frame)
      webView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
      webView.loadRequest(URLRequest.init(url: url))
      view.addSubview(webView)
      

      【讨论】:

        【解决方案9】:

        我们是 iOS 程序员,不是 JS/Web 程序员,所以请继续使用 swift 和 Apple API。 更快、更简洁的方法是使用 Quicklook。

        我引用 calimarkus。

        反正代码很简单:

        //  Copyright © 2019 ing.conti. All rights reserved.
        //
        
        import UIKit
        import QuickLook
        
        
        class ViewController: UIViewController, QLPreviewControllerDataSource {
        
            var previewController:QLPreviewController?
        
            override func viewDidLoad() {
                super.viewDidLoad()
                // Do any additional setup after loading the view, typically from a nib.
        
                self.previewController = QLPreviewController()
                previewController!.dataSource = self
                present(previewController!, animated: true)
        
            }
        
            //QL delegate:
        
            func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
                return 1
            }
        
        
            func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
        
                guard let url = Bundle.main.url(forResource: "SAMPLE", withExtension: "pdf") else {
                    fatalError("Could not load pdf")
                }
        
                return url as QLPreviewItem 
            }
        }
        

        【讨论】:

          【解决方案10】:

          Apple 的 PDFKit 框架提供了大量代码来帮助我们处理 PDF,其中最有用的是 PDFView——它将 PDF 呈现到屏幕上并让用户与之交互。

          要试用它,首先导入 PDFKit 框架:

          import PDFKit
          

          接下来,将此代码添加到您的 viewDidLoad() 方法以创建 PDFView 并使其填充所有可用空间:

          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
          

          最后,创建一个 URL 指向您捆绑中某处(或您的文档目录中的一个)中的 PDF,然后从中创建一个 PDFDocument 对象并将其传递给 PDF 视图:

          guard let path = Bundle.main.url(forResource: "example", withExtension: "pdf") else { return }
          
          if let document = PDFDocument(url: path) {
              pdfView.document = document
          }
          

          完成!

          【讨论】:

          【解决方案11】:

          在我的例子中,我有一个 tableView,它基于选定的行或详细信息指示符(在我的应用程序的不同部分有两个不同的 ViewController)。我有一个 PDFView 的 @IBOutlet 并使用此代码打开所需的 PDF,该 PDF 保存在应用程序中:

          @IBOutlet weak var myPDFView: PDFView!
          
          var mySelection = String()
          
          override func viewDidLoad() {
              super.viewDidLoad()
          
              if let path = Bundle.main.path(forResource: mySelection, ofType: "pdf") {
                  let url = URL(fileURLWithPath: path)
          
                  if let myDocument = PDFDocument(url: url) {
                      myPDFView.document = myDocument
                      myPDFView.autoScales = true
                      myPDFView.displayMode = .singlePageContinuous
                      myPDFView.displayDirection = .vertical
                      myPDFView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
                  }
              }
          }
          

          这一切都很好。正确的 PDF 可以轻松加载并像我想要的那样填满屏幕。但是,PDF 总是向上滚动一点,导致顶部隐藏在导航栏下。请注意,在下面的屏幕截图中,文档的顶部不可见,但底部在底部标签栏的上方。我认为这与从页面底部开始的 PDF 坐标有关,但无法弄清楚如何让它加载文档的最顶部,因此顶部的背景是可见的。

          也许这与 autoScales 有关?

          【讨论】:

            【解决方案12】:

            你也可以使用 UIDocumentInteractionController !

            let docController = UIDocumentInteractionController(url: URL(fileURLWithPath: path)) documentInteractionController.presentPreview(animated: true)

            【讨论】:

              猜你喜欢
              • 2014-06-07
              • 1970-01-01
              • 1970-01-01
              • 2016-03-24
              • 2011-10-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-05-06
              相关资源
              最近更新 更多