之前在掘金上發(fā)布的文章原文鏈接:https://juejin.im/entry/5a71ad616fb9a01cad7c7b8c
最近公司添加個查看pdf合同的功能吆录,之前隨便百度了下發(fā)現(xiàn)webView加載或者View自己畫都可以顯示作箍,不過最后發(fā)現(xiàn)少了一樣?xùn)|西,沒錯紅紅的簽名公章不見了,安卓瀏覽器打開都沒問題烦衣,分享文件到手機(jī)qq嚷闭、微信、掌閱等常用app打開也沒有顯示簽章论寨,在一段痛苦的糾結(jié)中反思問題查找解決方案星立,然后發(fā)現(xiàn)qq打開下方分享按鈕處有個創(chuàng)建PDF爽茴,打開后發(fā)現(xiàn)簽章出來了或者選擇打印機(jī)也會顯示簽章,因此也確定了竟然能出來那么肯定有解決方法绰垂,于是開始了爬坑室奏。
隨便說一下網(wǎng)絡(luò)上的加載PDF的第三方框架也并不好用,最終還是在蘋果開發(fā)框架中找到了解決方案
開始上代碼 1.首先導(dǎo)入系統(tǒng)
QuickLook.framework
```框架劲装,怎么導(dǎo)入不簡述了
2.引入頭文件
#import <QuickLook/QuickLook.h>
QLPreviewControllerDataSource
主要一下2個代理方法
(NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller{ return 1; }
(id)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index{
return [NSURL fileURLWithPath:pdfFilePath]; }
完整代碼如下:
url 為pdf 地址鏈接胧沫,訪問地址返回pdf 數(shù)據(jù)流
-(void)loadPdfResource:(NSString *)url{ pdfFilePath = [self getFullPath]; NSFileManager *fileManager = [NSFileManager defaultManager];
if(![fileManager fileExistsAtPath:pdfFilePath])
{
// NSLog(@"文件不存在"); // 下載pdf數(shù)據(jù) [SVProgressHUD showWithStatus:@"loading..."]; self.pdfData=[[NSMutableData alloc]init]; NSURLSessionConfiguration *config =[NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]]; NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:url]];
? ? [task resume];
? ?
}else{
// NSLog(@"文件存在"); [self pushQLPreviewController]; }
}
下載pdf 數(shù)據(jù)主要 實(shí)現(xiàn)了 NSURLSessionDelegate 代理方法
#pragma mark --- 接收到數(shù)據(jù)調(diào)用
(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler{ //允許繼續(xù)響應(yīng) completionHandler(NSURLSessionResponseAllow); //獲取文件的總大小 // NSInteger totalLength = response.expectedContentLength; }
#pragma mark --- 接收到數(shù)據(jù)調(diào)用
(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData )data{ NSPrintf(@"didReceiveData:%@",data); //將每次接受到的數(shù)據(jù)拼接起來 [self.pdfData appendData:data]; //計算當(dāng)前下載的長度 // NSInteger nowlength = self.pdfData .length; // CGFloat value = nowlength1.0/self.totalLength; }
#pragma mark ---下載完成調(diào)用
(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error{ NSLog(@"self.pdfData:\n%@",self.pdfData);
NSString *filename =[self getFullPath]; [self.pdfData writeToFile:filename atomically:YES]; [SVProgressHUD dismiss];
if (self.pdfData) { NSLog(@"OK"); [self showPDFWebView: filename]; }else{ NSLog(@"Sorry"); }
}
下載完成 寫入本地數(shù)據(jù) 之后 展示pdf,重點(diǎn)來了!
-(void)showPDFWebView:(NSString *)filename{
NSFileManager *fileManager = [NSFileManager defaultManager];
if(![fileManager fileExistsAtPath:pdfFilePath])
{
? ? NSLog(@"文件不存在");
? ?
}else{
? ? NSLog(@"文件存在");
? ?
? ? [self pushQLPreviewController];
}
}
推出pdf 頁面
-(void)pushQLPreviewController{ QLPreviewController *QLPVC = [[QLPreviewController alloc] init]; QLPVC.dataSource = self; [self.navigationController pushViewController:QLPVC animated:YES]; }
最后需要自定義 self.pdfData
Xcode升級到10.1以后發(fā)現(xiàn)present頁面后PDF文件會有類似安全區(qū)的空檔占业,改為push頁面解決問題绒怨,初步判斷應(yīng)該是我項目中使用了RTNavationController的問題
over~