如何在iOS应用中不使用UIWebView打开PDF文件?
解决方案:避开UIWebView加载SOAP返回的PDF数据(Objective-C)
我完全懂你的处境——明明用UIWebView加载PDF是最省心的路子,但需求卡着不得不绕开它,而且你的PDF数据还是从SOAP服务拿的,一开始谷歌搜了半天也没找到靠谱的解决方向,还好后来你挖到了相关参考内容。下面给你整理两种可行的思路,优先满足你避开UIWebView的需求:
1. 用QLPreviewController原生预览
这是iOS系统自带的预览控制器,支持直接处理NSData格式的PDF,完全不需要依赖UIWebView:
#import <QuickLook/QuickLook.h> // 假设你已经从SOAP服务获取到PDF的NSData NSData *pdfData = [self fetchPDFDataFromSOAPService]; // 初始化预览控制器 QLPreviewController *previewVC = [[QLPreviewController alloc] init]; previewVC.dataSource = self; previewVC.delegate = self; // 弹出预览界面 [self presentViewController:previewVC animated:YES completion:nil]; // 实现QLPreviewControllerDataSource协议方法 - (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller { return 1; } - (id<QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index { // 把NSData写入临时文件,因为QLPreviewController需要文件URL NSString *tempPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"temp_pdf.pdf"]; [pdfData writeToFile:tempPath atomically:YES]; return [NSURL fileURLWithPath:tempPath]; }
2. 用Core Graphics自定义渲染PDF页面
如果需要更个性化的展示效果(比如自定义分页、缩放控制),可以直接用Core Graphics解析PDF数据并绘制到视图上:
#import <CoreGraphics/CoreGraphics.h> // 从SOAP服务获取PDF数据 NSData *pdfData = [self fetchPDFDataFromSOAPService]; CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((__bridge CFDataRef)pdfData); CGPDFDocumentRef pdfDocument = CGPDFDocumentCreateWithProvider(dataProvider); CGDataProviderRelease(dataProvider); // 获取PDF第一页(多页的话需要循环处理) CGPDFPageRef firstPage = CGPDFDocumentGetPage(pdfDocument, 1); // 获取页面尺寸 CGRect pageFrame = CGPDFPageGetBoxRect(firstPage, kCGPDFMediaBox); // 创建承载PDF的自定义视图 UIView *pdfContainerView = [[UIView alloc] initWithFrame:pageFrame]; pdfContainerView.backgroundColor = [UIColor whiteColor]; [self.view addSubview:pdfContainerView]; // 绘制PDF到画布 UIGraphicsBeginImageContext(pageFrame.size); CGContextRef context = UIGraphicsGetCurrentContext(); // 翻转坐标系(Core Graphics和UIKit坐标系方向相反) CGContextTranslateCTM(context, 0, pageFrame.size.height); CGContextScaleCTM(context, 1.0, -1.0); CGContextDrawPDFPage(context, firstPage); UIImage *pdfImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // 将绘制好的PDF图片添加到视图 UIImageView *pdfImageView = [[UIImageView alloc] initWithImage:pdfImage]; pdfImageView.frame = pdfContainerView.bounds; [pdfContainerView addSubview:pdfImageView]; // 释放资源 CGPDFPageRelease(firstPage); CGPDFDocumentRelease(pdfDocument);
另外补充你后来找到的UIWebView方案(虽然你需要避开,但可以作为备用参考):
如果不受限制使用UIWebView,直接加载NSData格式的PDF代码很简单:
UIWebView *pdfWebView = [[UIWebView alloc] initWithFrame:self.view.bounds]; [pdfWebView loadData:pdfData MIMEType:@"application/pdf" textEncodingName:@"utf-8" baseURL:nil]; [self.view addSubview:pdfWebView];
内容的提问来源于stack exchange,提问作者new2ios
相关产品推荐
相关产品推荐

