29

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

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

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

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

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

非常感谢您的反馈。

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

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

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

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

4

12 回答 12

38

很多选项,这里有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 示例代码。(使用 UIPageViewController + CATiledLayer + UIScrollView)

于 2012-06-04T09:20:53.537 回答
35

您可以使用 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];
            
}
于 2012-06-04T09:14:11.983 回答
11

我建议您在处理 PDF 文件时使用QuickLook 框架。

于 2012-06-04T09:23:34.553 回答
5

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

PDFKit > PDFView

于 2018-02-28T06:26:47.977 回答
5

斯威夫特 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)
于 2018-04-23T10:24:49.093 回答
3

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
}

完毕!

于 2019-03-02T05:37:02.437 回答
2

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

呈现和打开 pdf 文件的简单方法

于 2013-09-19T23:40:17.177 回答
2

就我而言,我有一个 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 有关?

于 2019-03-03T14:13:31.397 回答
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];
于 2016-07-30T08:19:58.703 回答
1

您还可以使用 UIDocumentInteractionController !

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

于 2019-03-06T18:48:30.563 回答
1

已经很晚了,但是 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];
于 2018-03-20T06:57:08.070 回答
0

我们是 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 
    }
}
于 2019-01-23T12:43:37.087 回答