美文网首页
iOS-PDF 的显示与加载

iOS-PDF 的显示与加载

作者: 醉叶惜秋 | 来源:发表于2018-02-07 22:50 被阅读70次

今天公司群里讨论电子协议的方案, 其中提到 PDF 的显示与加载问题. 之前没做过类似的问题. 只好晚上回来补补课了.

UIWebView加载与显示 PDF

#import "ViewController.h"
#import <WebKit/WebKit.h>

@interface ViewController ()<UIWebViewDelegate>

@property (nonatomic, strong)UIWebView *webView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:self.webView];
    
    NSURL *pdfURL = [NSURL fileURLWithPath:@"/Users/mengfa/Desktop/iOS开发 PDF 的显示与加载/iOS开发 PDF 的显示与加载/01_10_MapKit使用及相关知识介绍.pdf"];
    NSURLRequest *request = [NSURLRequest requestWithURL:pdfURL];
    //设置缩放
    [self.webView setScalesPageToFit:YES];
    [self.webView loadRequest:request];
    self.webView.delegate = self;
}

- (void)webViewDidFinishLoad:(UIWebView *)webView{
    
}
- (void)viewDidLayoutSubviews{
    
}

@end

上面这段代码即可加载本地的 PDF, 将路径换成网络 URL 即可加载网络的 PDF.

注意:
UIWebView加载PDF文件的过程,在不同的iOS系统中有一些区别(诸如iOS8以及iOS9)。在加载HTML时,当方法- (void)webViewDidFinishLoad:(UIWebView *)webView执行时,大多数情况下,网页已经加载完成,可以做进一步的操作。但是在加载PDF时,在iOS8的系统中,仅仅只是加载了UIWebPDFView控件,而其中的UIPDFPageView还没有进行插入,我们不能做具体的操作,这个时候可以在viewDidLayoutSubviews中进行进一步操作。

QLPreviewController加载与显示PDF

#import "ViewController.h"
#import <QuickLook/QuickLook.h>

@interface ViewController ()<QLPreviewControllerDelegate, QLPreviewControllerDataSource>


@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    QLPreviewController * qlPreview = [[QLPreviewController alloc]init];
    qlPreview.dataSource = self; //需要打开的文件的信息要实现dataSource中的方法
    qlPreview.delegate = self; //视图显示的控制
    [self presentViewController:qlPreview animated:YES completion:^{
        //需要用模态化的方式进行展示
    }];
    
}


- (NSInteger)numberOfPreviewItemsInPreviewController:(nonnull QLPreviewController *)controller {
    return 1;//_PDFArray.count; //需要显示的文件的个数
}

- (nonnull id<QLPreviewItem>)previewController:(nonnull QLPreviewController *)controller previewItemAtIndex:(NSInteger)index {
    //返回要打开文件的地址,包括网络或者本地的地址
    
    NSString *path = [[NSBundle mainBundle] pathForResource:@"1-1-Twitter Messaging的架构演化之路-郭斯杰.pdf" ofType:nil];
    NSURL * url = [NSURL fileURLWithPath:path];
    return url;
}
@end

注意:
QLPreviewController需要用到QuickLook.framework,要在工程文件,Build Phases -> Link Binary With Libraries 中添加
在要使用的文件中导入QuickLook/QuickLook/h头文件,这是系统的,要用尖括号
加入代理QLPreViewControllerDelegate
在要使用的地方加入
*- (void)dismissReaderViewController:(ReaderViewController *)viewController```
因为PDF阅读器可能是push出来的,也可能是present出来的,为了更好的效果,这个代理方法可以实现很好的退出

这里加个小tip(下载PDF到本地)

因为有时候使用诸如vrf之类的三方,并不支持URL的形式,需要加入到本地才可以,这个时候我们就需要将其下载到本地。我在这个提供几个方式供参考:

  • 使用AFNetworking下载
  • 使用NSData读取URL然后保存到本地文件的方式

详情参考Demo
附github地址:
https://github.com/hllGitHub/PDFViewAndDownload

相关文章

  • iOS-PDF 的显示与加载

    今天公司群里讨论电子协议的方案, 其中提到 PDF 的显示与加载问题. 之前没做过类似的问题. 只好晚上回来补补课...

  • JavaScript--预加载与延迟加载

    JavaScript--预加载与延迟加载 1. 预加载:就是页面打开,图片什么的都加载好了(优先显示图片) 2. ...

  • 【原创】unity简单封装实现一个进度加载 和文本提示

    首先,加载中 显示加载动画和正在加载, 加载完成 隐藏,加载失败 则显示重新加载按钮和 加载失败的文字。 要解决自...

  • iOS-PDF阅读器(显示签章)

    pdf.js是火狐浏览器的开源项目,github地址。 教程中把pdf.js作为服务端的步: 1、clone工程到...

  • loading 文档

    小程序显示加载中 vue 组件显示加载中

  • Java Class.forName() 与 ClassLoad

    类的显示加载 VS 类的隐式加载 显示加载:通过 Class c = Class.forName("Student...

  • 四、离屏渲染

    离屏渲染与正常渲染 屏幕上最终显示的数据有两种加载流程 正常渲染加载流程 离屏渲染加载流程离屏渲染与正常渲染 常⻅...

  • 类的加载过程

    类的加载过程 加载 根据查找路径找到相应的class文件,然后导入,类的加载方式分为隐式加载和显示加载两种 显示加...

  • 场景加载管理

    通常的场景加载(切换)过程如下: 从场景A要进入场景B 系统显示加载界面,显示场景B的预加载进度 场景B加载完成,...

  • 2018-01-05

    SDWebImage 加载显示 GIF 与性能问题 SDWebImage 4.0 之前,可以用 UIImageVi...

网友评论

      本文标题:iOS-PDF 的显示与加载

      本文链接:https://www.haomeiwen.com/subject/cjadzxtx.html