iOS 打開pdf文件的幾種方式

目錄:
一志衍、 WKWebView加載本地或者網(wǎng)絡pdf文檔
二慧起、 利用QLPreviewController加載pdf文檔 (系統(tǒng)框架<QuickLook/QuickLook.h>
三译暂、 利用PDFView(系統(tǒng)框架<PDFKit/PDFKit.h>)打開

特別說明??:加載網(wǎng)絡pdf文檔最好下載到本地然后加載永淌,不然可能會卡頓濒生,有時還有莫名的加載失敗甚至閃退...

第一種:WKWebView加載本地或者網(wǎng)絡pdf文檔

  • 按照這種方式和普通的加載html沒有任何區(qū)別健爬,這里小編就不做多余的贅述控乾;
  • 存在的問題??:加載pdf后,再push到另外一個頁面娜遵,返回到WKWebView頁面蜕衡,原先的內(nèi)容不見了,會變成空白一片;

第二種:利用QLPreviewController加載pdf文檔 ,首先判斷是否加載到本地设拟,如果有直接加載本地的慨仿,如果沒有就進行文件下載久脯,然后加載文件:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.previewController  =  [[QLPreviewController alloc]  init];
    self.previewController.dataSource  = self;
}
// 預覽網(wǎng)絡文件
- (void)previewInternet {
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
    NSString *urlStr = self.url;
    NSString *fileName = [urlStr lastPathComponent]; //獲取文件名稱
    NSURL *URL = [NSURL URLWithString:urlStr];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    
    //判斷是否存在
    if([self isFileExist:fileName]) {
        NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
        NSURL *url = [documentsDirectoryURL URLByAppendingPathComponent:fileName];
        self.fileURL = url;
        [self presentViewController:self.previewController animated:YES completion:nil];
        //刷新界面,如果不刷新的話,不重新走一遍代理方法镰吆,返回的url還是上一次的url
        [self.previewController refreshCurrentPreviewItem];
    }else {
        [SVProgressHUD showWithStatus:@"下載中"];
        NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress *downloadProgress){
            
        } destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
            NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
            NSURL *url = [documentsDirectoryURL URLByAppendingPathComponent:fileName];
            return url;
        } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
            [SVProgressHUD dismiss];
            self.fileURL = filePath;
            [self presentViewController:self.previewController animated:YES completion:nil];
            //刷新界面,如果不刷新的話帘撰,不重新走一遍代理方法,返回的url還是上一次的url
            [self.previewController refreshCurrentPreviewItem];
        }];
        [downloadTask resume];
    }
}

//判斷文件是否已經(jīng)在沙盒中存在
-(BOOL) isFileExist:(NSString *)fileName
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path = [paths objectAtIndex:0];
    NSString *filePath = [path stringByAppendingPathComponent:fileName];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    BOOL result = [fileManager fileExistsAtPath:filePath];
    return result;
}

#pragma mark - QLPreviewControllerDataSource
-(id<QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index {
    return self.fileURL;
}

- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)previewController{
    return 1;
}

第三種:利用PDFView(系統(tǒng)框架<PDFKit/PDFKit.h>)打開
首先判斷是否加載到本地万皿,如果有直接加載本地的摧找,如果沒有就進行文件下載,然后加載文件:

注意??:本框架在iOS11.0+后可用

-(void)setupPDF{
    
    self.pdfView = [[PDFView alloc] initWithFrame:CGRectMake(0, kNavBarAndStatusBarHeight + 44, kScreenWidth, kScreenHeight - kNavBarAndStatusBarHeight - 44)];
    self.pdfView.autoScales = YES;
    self.pdfView.userInteractionEnabled = YES;
    [self.view addSubview:self.pdfView];
    
    if ([self.urlString isNoEmpty]) {
        self.sourceURL = [NSURL URLWithString:self.urlString];
    }else{
        return;
    }
    //路徑作為緩存key
    _cacheFileKey = self.sourceURL.absoluteString;
    
    __weak __typeof(self) wself = self;
    _queryCacheOperation = [[WebCacheHelpler sharedWebCache] queryDataFromMemory:_cacheFileKey cacheQueryCompletedBlock:^(id data, BOOL hasCache) {
        dispatch_async(dispatch_get_main_queue(), ^{
            if(hasCache) {
                wself.pdfDocument = [[PDFDocument alloc] initWithData:data];
                wself.pdfDocument.delegate = self;
                wself.pdfView.document = self.pdfDocument;
            }else{
                [wself startDownloadTask:_sourceURL isBackground:YES];
            }
        });
    }];
}

//開始資源下載任務
- (void)startDownloadTask:(NSURL *)URL isBackground:(BOOL)isBackground {
    __weak __typeof(self) wself = self;
    _queryCacheOperation = [[WebCacheHelpler sharedWebCache] queryDataFromMemory:_cacheFileKey cacheQueryCompletedBlock:^(id data, BOOL hasCache) {
        dispatch_async(dispatch_get_main_queue(), ^{
            if(hasCache) {
                wself.pdfDocument = [[PDFDocument alloc] initWithData:data];
                wself.pdfDocument.delegate = self;
                wself.pdfView.document = self.pdfDocument;
                return;
            }
            
            if(wself.combineOperation != nil) {
                [wself.combineOperation cancel];
            }
            [WEHUD showWaitHUD];
            wself.combineOperation = [[WebDownloader sharedDownloader] downloadWithURL:URL responseBlock:^(NSHTTPURLResponse *response) {
                
            } progressBlock:^(NSInteger receivedSize, NSInteger expectedSize, NSData *data) {
                
            } completedBlock:^(NSData *data, NSError *error, BOOL finished) {
                if(!error && finished) {
                    //下載完畢牢硅,將緩存數(shù)據(jù)保存到本地
                    [[WebCacheHelpler sharedWebCache] storeDataToDiskCache:data key:wself.cacheFileKey];
                }
                [WEHUD hideHUD];
                wself.pdfDocument = [[PDFDocument alloc] initWithData:data];
                wself.pdfDocument.delegate = self;
                wself.pdfView.document = self.pdfDocument;
            } cancelBlock:^{
                [WEHUD hideHUD];
                [WEHUD showWarningHUD:@"文件下載失敗"];
            } isBackground:isBackground];
        });
    }];
}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蹬耘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子减余,更是在濱河造成了極大的恐慌综苔,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件位岔,死亡現(xiàn)場離奇詭異休里,居然都是意外死亡,警方通過查閱死者的電腦和手機赃承,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門妙黍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瞧剖,你說我怎么就攤上這事拭嫁。” “怎么了抓于?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵做粤,是天一觀的道長。 經(jīng)常有香客問我捉撮,道長怕品,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任巾遭,我火速辦了婚禮肉康,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘灼舍。我一直安慰自己吼和,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布骑素。 她就那樣靜靜地躺著炫乓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上末捣,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天侠姑,我揣著相機與錄音,去河邊找鬼箩做。 笑死结借,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的卒茬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼咖熟,長吁一口氣:“原來是場噩夢啊……” “哼圃酵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起馍管,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤郭赐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后确沸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捌锭,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年罗捎,在試婚紗的時候發(fā)現(xiàn)自己被綠了观谦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡桨菜,死狀恐怖豁状,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情倒得,我是刑警寧澤泻红,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站霞掺,受9級特大地震影響谊路,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜菩彬,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一缠劝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骗灶,春花似錦剩彬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春轻黑,著一層夾襖步出監(jiān)牢的瞬間糊肤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工氓鄙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留馆揉,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓抖拦,卻偏偏與公主長得像升酣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子态罪,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容