You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:39:34