如何在iOS上显示pdf

问题描述 投票:26回答:12

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

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

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

OFF-TOPIC:哪个更好?要提取本地文件或使用PDF文件的在线URL?

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

反馈非常感谢。

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

考虑到这一点,我现场提出了一个与我自己的问题相反的论点(对不起,如果有人觉得你在浪费时间在我身上)。<,我是一个喜欢质疑可能性的人可以采取不同的方法解决问题)为了节省时间从不断更新并提供实时基础解决方案,即使用UIWebView(我知道这与我的SO线程的目的相矛盾),因此proj基于在线网站(从那里获取我的内容和来源),如果我要为文章部分加载他们的网站,我会大胆地说通过添加NSString变量,我可以在NSRange中添加与UIWebView一起对viewDidLoad起作用,使得URL永远不会离开新闻部分和PDF URL。例如使用if和NSRange函数的组合来反击检查URL是否只包含新闻部分和PDF URL)

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

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

ios pdf uiwebview
12个回答
34
投票

您可以使用UIWebView直接从捆绑包中获取PDF,而无需调用在线Web服务。

本地档案:

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];
            
}

1
投票

你也可以使用UIDocumentInteractionController!

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


0
投票

我们是iOS编码器,没有JS / Web程序员,所以请保持快速和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 
    }
}

0
投票

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

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

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

if let document = PDFDocument(url: path) {
    pdfView.document = document
}

完成!


37
投票

很多选项,这里有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查看器,如苹果ZoomingPDFViewer example code。 (使用UIPageViewController + CATiledLayer + UIScrollView)


11
投票

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


5
投票

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)

3
投票

IOs已经推出了一个新的工具包。它有许多与显示PDF相关的专用功能。您可以在其中使用PdfView类来显示来自本地文件或URL的PDF。

PDFKit> PDFView


2
投票

我找到了这个网站,并且是一个非常简单的方法来打开pdf,其中包含任何可在iPhone上加载的pdf应用程序。 (我更喜欢iBooks)

simple way to present and open a pdf file


2
投票
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
投票

现在已经很晚了,但在加载pdf文件时,UIWebview存在一些限制,它不会正确加载可编辑的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];

1
投票

在我的例子中,我有一个tableView,它基于选定的行或详细指示符分段到PDFView(在我的应用程序的不同部分,每个都有两个不同的ViewControllers)。我有一个用于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有关?

© www.soinside.com 2019 - 2024. All rights reserved.