最近在做的项目中有相关pdf文件预览的功能,所以了解了一下相关的资料。基本上网上给出来的方法有两种,分别是用UIWebVie和CGContextDrawPDFPage,可以点击查看,但是本文所要讲的是另外一种方式-----使用QLPreViewController进行预览,QLPreViewController不仅支持PDF,还支持其他多种文件的预览,可谓功能强大。
先看下官方文档的说法:
A displayed preview includes a title taken from the last path component of the item URL. You can override this by implementing a previewItemTitle
accessor for the preview item.
A Quick Look preview controller can display previews for the following items:
-
iWork documents
-
Microsoft Office documents (Office ‘97 and newer)
-
Rich Text Format (RTF) documents
-
PDF files
-
Images
-
Text files whose uniform type identifier (UTI) conforms to the
public.text
type (see Uniform Type Identifiers Reference) -
Comma-separated value (csv) files
使用方式:
1.首先新建一个QLPreviewController对象preview;
2.遵循协议QLPreviewControllerDataSource,设置代理;
3.实现协议方法:返回文档数量方法- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller;
返回URL的方法 - (id <QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index;
4.模态或push出QLPreviewController的对象preview。
关键代码:
#pragma mark -QLPreviewControllerDataSource
- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller {
return 1;
}
- (id<QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index {
NSString *filePath = [[HKClassRoomManager sharedInstance] getFilePath:self.classFile];
NSAssert(filePath, @"preview nil item");
NSFileManager* fileManager = [NSFileManager defaultManager];
NSError* error = nil;
if ([fileManager fileExistsAtPath:filePath]) {
NSDictionary* fileInfo = [fileManager attributesOfItemAtPath:filePath
error:&error];
NSInteger fileSize = [[fileInfo objectForKey:NSFileSize] integerValue];
if (fileSize >= 1024 * 1024 * 10) {
[NSObject showHudTipStr:@"文件较大,加载可能需要一段时间,请等待...."];
}
}
NSData *fileData = [NSData dataWithContentsOfFile:filePath];
//判断是UNICODE编码
NSString *isUNICODE = [[NSString alloc] initWithData:fileData encoding:NSUTF8StringEncoding];
//还是ANSI编码
NSString *isANSI = [[NSString alloc] initWithData:fileData encoding:-2147482062];
if (isUNICODE) {
NSString *retStr = [[NSString alloc]initWithCString:[isUNICODE UTF8String] encoding:NSUTF8StringEncoding];
NSData *data = [retStr dataUsingEncoding:NSUTF16StringEncoding];
NSError *error = nil;
[data writeToFile:filePath options:NSDataWritingAtomic error:&error];
}
else if(isANSI){
NSData *data = [isANSI dataUsingEncoding:NSUTF16StringEncoding];
NSError *error = nil;
[data writeToFile:filePath options:NSDataWritingAtomic error:&error];
}
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
return fileURL;
}