iOS开发PDF的显示与加载

iOS开发PDF的显示与加载

前言

在实际的开发过程中,我们会遇到一些需要显示PDF的场景,比如一些表单,比如官方文件(为了保证原有的格式显示正常,通常会做成PDF来展示),这里我们来讨论一个展示PDF的方式。

PDF可能是网络加载的,也可能是本地的,我们现在来分别讨论。

网络加载

这种方式是提供了PDF的URL,iOS直接提供的根据URL来展示的方式目测有UIWebView和QLPreviewController
UIWebView

    NSURL *pdfURL = [NSURL fileURLWithPath:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:pdfURL];
    //设置缩放
    [self.webView setScalesPageToFit:YES];
    [self.webView loadRequest:request];```
    
但是要注意一点,UIWebView加载PDF文件的过程,在不同的iOS系统中有一些区别(诸如iOS8以及iOS9)。在加载HTML时,当方法`- (void)webViewDidFinishLoad:(UIWebView *)webView`执行时,大多数情况下,网页已经加载完成,可以做进一步的操作。但是在加载PDF时,在iOS8的系统中,仅仅只是加载了UIWebPDFView控件,而其中的UIPDFPageView还没有进行插入,我们不能做具体的操作,这个时候可以在viewDidLayoutSubviews中进行进一步操作。

**QLPreviewControlle**r的具体使用将在本地加载中详述,因为完全一样

### 本地加载
有很多都只是提供了URL的PDF链接,机智的boy会把保留在本地,避免重复下载,节省流量和时间。有的也是直接就放在本地的,变化的可能性很小。那么对于放在本地的应该如何处理呢?这里也有几种方式。

* UIWebView 这是一种通用的方式,对于本地的PDF展示也是如此,只要把上面的fileName换成本地的文件地址即可。但是这个方式有个很大的弊端,就是只有最基本的展示,不能放大缩小,也没有其他的相关交互,当然,混编除外,可是有必要这样做吗?对于已经处理好的PDF而且仅仅最基本展示,这种方式最方便。
* 利用CGContextDrawPDFPage,这种方式我并不熟悉,所以这里只是提一下,有兴趣的朋友可以自己找一下相关资料。
* QLPreviewController 这是系统提供的预览方式,其实展示起来效果也差不多,支持放大缩小的手势,还自带系统分享功能。  
* 使用强大的第三方[Reader(vfr)](https://github.com/vfr/Reader),这个很强大,功能很多,也提供了一些自定义的控制常量。诸如`READER_FLAT_UI`的。想要扩展的话,可以自己改写ReadViewController文件
 
 现在来具体讲述一下这几种方式的使用:
 
####  UIWebView
诸如加载网络PDF
```//self.fileName指向文件的全路径
    NSURL *pdfURL = [NSURL fileURLWithPath:fileName];
    NSURLRequest *request = [NSURLRequest requestWithURL:pdfURL];
    //设置缩放
    [self.webView setScalesPageToFit:YES];
    [self.webView loadRequest:request];```
    
####  QLPreviewController
* QLPreviewController需要用到QuickLook.framework,要在工程文件,Build Phases -> Link Binary With Libraries 中添加
* 在要使用的文件中导入QuickLook/QuickLook/h头文件,这是系统的,要用尖括号
* 加入代理QLPreViewControllerDelegate
* 在要使用的地方加入

QLPreviewController * qlPreview = [[QLPreviewController alloc]init];
qlPreview.dataSource = self; //需要打开的文件的信息要实现dataSource中的方法
qlPreview.delegate = self; //视图显示的控制
[self presentViewController:qlPreview animated:YES completion:^{
//需要用模态化的方式进行展示
}]; ```
这是模态化,也可以push,一样的。

  • 实现代理方法
-(NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller  
{  
    return _PDFArray.count; //需要显示的文件的个数  
}  
-(id<QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index  
{  
    //返回要打开文件的地址,包括网络或者本地的地址  
    NSURL * url = [NSURL fileURLWithPath:self.fileName];  
    return url;  
}  ```
还有其他的,这是DataSource,还有delegate中的相关方法,可以根据需要考虑是否实现。

#### Reader(vfr)
* 下载SDK,地址:https://github.com/vfr/Reader ,暂时不支持cocoapods,得手动导入
* 导入所需要的框架:
**MessageUI.framework** **ImageIO.framework** **QuartzCore.framework**
* 将Classes和Sources导入到项目中,建议还把Graphics也导入。
* 所需文件中导入**ReaderViewController.h**头文件,
以及添加代理**ReaderViewControllerDelegate**
* 使用:

NSString *path = [[NSBundle mainBundle] pathForResource:@"MobileHIG_iOS7_中文.pdf" ofType:nil];
ReaderDocument *doc = [[ReaderDocument alloc] initWithFilePath:path password:nil];
ReaderViewController *rvc = [[ReaderViewController alloc] initWithReaderDocument:doc];
rvc.delegate = self;
[self presentViewController:rvc animated:YES completion:nil];```

  • 实现代理方法
 - (void)dismissReaderViewController:(ReaderViewController *)viewController``` 
因为PDF阅读器可能是push出来的,也可能是present出来的,为了更好的效果,这个代理方法可以实现很好的退出

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

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

详情参考Demo

> 
附github地址:
https://github.com/hllGitHub/PDFViewAndDownload
如果感兴趣或者觉得不错的话给个star,多谢了
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,408评论 4 371
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,690评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,036评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,726评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,123评论 3 296
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,037评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,178评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,964评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,703评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,863评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,333评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,658评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,374评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,195评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,988评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,167评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,970评论 2 279

推荐阅读更多精彩内容