iOS中加载PDF

前言

我们在开发iOS的项目中多多少少会遇到加载pdf的需求,前段时间项目中需要将网络的pdf显示出来,原本以为很简单的一个小需求,用WKWebView加载pdf的url即可,没想到却颇费了一番周折。先简单的介绍一下大概吧,这个pdf是一个电子处方,上面有一些医生开具的药品处方及基本信息,最大的不同点是医生的签名是一个电子签章(类似于公司办公用的印章),将pdf的url丢给WKWebView 后,发现了一个问题,就是在iOS12之后WKWebView可以将这个红色的电子签章显示出来,但是在iOS之前除了电子签章不能显示外其他信息均正常显示,网上说WKWebView在iOS12之后做了一些优化,但是不管这么说,我们的目的是要这个红色的电子签章在不同的系统都要显示出来,于是就有了这篇文章,希望能帮助以后有这类似需求的人能少走一些弯路。

iOS中PDF显示的几种方式

  • WKWebView
  • QLPreviewController
  • UIDocumentInteractionController
  • 第三方pdf.js

WKWebView

最先使用的是WKWebView来显示pdf,iOS12之后红色签章可以正常显示,为了处理iOS12以下的系统,网上说可是使用pdf.js来加载,这里对pdf.js的使用不做过多的介绍,网上的集成使用教程都写的比较详细了pdf.js使用,这里只说下我在使用的过程中遇到的一些问题。这个pdf是我们是存储在阿里云的服务器上,url中加了一个过期的验证,也就是说这个url过一段时间就会失效,在显示的时候需要重新获取这个url,第一个问题就是,直接使用url加载的话会报错,不能正常显示,原因未知,使用其他不带红色签章的pdf url可以正常显示。于是我将pdf下载到本地,用pdf.js去渲染的话,可以显示红色的签章,但是渲染的时间较长,大概平均4-5分钟(pdf不是很大,1M左右),于是我最终折腾了半天,放弃了使用pdf.js加载的方案。最终方案:对于iOS12之后的系统使用WKWebView加载,之前的系统使用QLPreviewController来显示。

    if ([UIDevice currentDevice].systemVersion.floatValue >= 12.0) {
        NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"pdf的url"]];
        self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
        [self.view addSubview:self.webView];
        [self.webView loadRequest:request];
    }

QLPreviewController

对于这QLPreviewController之前也是没有接触过,它可以显示一些文档,图片,pdf,音乐文件等,可以说是功能非常的强大了,他的使用页比较简单,和UITableView类似。
首先导入#import <QuickLook/QuickLook.h>,创建一个 QLPreviewController对象并实现QLPreviewControllerDataSource方法。

self.previewVC = [[QLPreviewController alloc] init];
self.previewVC.dataSource = self;

#pragma mark - QLPreviewControllerDataSource
- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller{
    return 1;// 这里我只需要显示一个pdf,大家可根据具体的业务需要填写
}

- (id<QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index{
    return self.fileURL;// 这里的这个url是我将pdf下载到本地后的存储路径。
}

对于pdf显示我先是将pdf下载到本地,加载的本地路径(直接显示pdf的网络url不能正常显示)

- (void)downLoadPDF{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.pdf",@"test"]];
    if ([fileManager fileExistsAtPath:filePath]) {
        [self.activityIndicatorView stopAnimating];
        [self.activityIndicatorView removeFromSuperview];
        [self addChildViewController:self.previewVC];
        [self.view addSubview:self.previewVC.view];
        self.previewVC.view.frame = self.view.bounds;
        self.fileURL = [NSURL fileURLWithPath:filePath];
        [self.previewVC reloadData];
    }else{
        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
        NSURL *URL = [NSURL URLWithString:self.downloadURL];
        NSURLRequest *request = [NSURLRequest requestWithURL:URL];
        AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
        NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
             // 下载到本地的pdf存储路径
             self.fileURL = [NSURL fileURLWithPath:filePath];
             return self.fileURL;
        } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
            //  这里加了个loading的状态,大家可根据需要添加
            [self.activityIndicatorView stopAnimating];
            [self.activityIndicatorView removeFromSuperview];
            if (!error) {
                // 下载成功将QLPreviewController 的view添加到当前视图,刷新数据
                [self addChildViewController:self.previewVC];
                [self.view addSubview:self.previewVC.view];
                self.previewVC.view.frame = self.view.bounds;
                // 这便可以正常显示红色的签章
                [self.previewVC reloadData];
            }
        }];
        [downloadTask resume];
    }
}

UIDocumentInteractionController

对于UIDocumentInteractionController的使用方法网上的介绍已经很详细了,这里只说明一点这个类也可以显示pdf文件,并且支持分享。有序丫的同学可以戳下面的链接👇
https://www.jianshu.com/p/4089c35e40b3

https://github.com/RuningFish/WTSummary
希望大家可以点点小星星,比心💗。

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

推荐阅读更多精彩内容