IOS实现tex、doc、pdf等文档读取
iCould相关配置
AppID配置
打开iCloud 开关,并配置一个iCloud容器。
工程配置
这里有个坑,xcode 必须要登录开发者账号,否则iCloud Document 选项选择会报错。
代码调用
获取选取本地文件路径
//获取UIDocumentPickerViewController对象,设置代理
- (UIDocumentPickerViewController *)getDocumentPickerVC {
if(self._curSelectView == nil)
{
NSArray *types = @[@"public.content",@"public.text",@"public.source-code",@"public.audiovisual-content",@"com.adobe.pdf",@"com.microsoft.word.doc"];
self._curSelectView = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:types inMode:UIDocumentPickerModeOpen];
//设置代理
self._curSelectView.delegate = self;
//设置模态弹出方式
self._curSelectView.modalPresentationStyle = UIModalPresentationFormSheet;
}
return self._curSelectView;
}
//实现选取文件代理接口
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls {
//获取授权
BOOL fileUrlAuthozied = [urls.firstObject startAccessingSecurityScopedResource];
if (fileUrlAuthozied) {
NSFileCoordinator *fileCoordinator = [[NSFileCoordinator alloc] init];
NSError *error;
[fileCoordinator coordinateReadingItemAtURL:urls.firstObject options:0 error:&error byAccessor:^(NSURL *newURL) {
[self loadDocContent:newURL];
UIViewController *presentingVc = self._curSelectView;
while (presentingVc.presentingViewController) {
presentingVc = presentingVc.presentingViewController;
}
if(presentingVc){
[presentingVc dismissViewControllerAnimated:YES completion:nil];
}
}];
[urls.firstObject stopAccessingSecurityScopedResource];
} else {
//授权失败
}
}
//实现代理
读取文件
UIDocumentPickerViewController 类没有直接读取文档类型文件的接口,虽然有很多方式可以预览文件,但这里我希望的是能拿到文件的数据。头疼了一会,突然看到有个关于读取webview内容的博客,然后就就忽然明白了。webview能加载不同类型的文件,我们可以通过webview加载文件,加载完成后,通过webview的js接口就能拿到我们想要的内容了。
//加载文件
-(void)loadDocContent:(NSURL*) url
{
NSData *data = [NSData dataWithContentsOfURL:url];
NSString* sType = [self getDocType:url];
[self._docContentView loadData:data MIMEType:sType textEncodingName:@"UTF-8" baseURL:nil];
//[self._docContentView loadRequest:[NSURLRequest requestWithURL:url]];
}
//获取文件类型
-(NSString *)getDocType:(NSURL *)url{
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLResponse *response = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
return response.MIMEType;
}
//需要设置webview代理
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
NSString *tempStr = [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerText"];
NSLog(@"%@",tempStr);
if (tempStr)
{
//拿到的数据要执行的操作
}
}
这里有一个坑的,loadRequest加载的文件必须要添加到工程里,否则会报文件找不到的错误,需要换用loadData方式,不过在这之前,要获取文件的类型。