无法在iOS中读取.doc文件的内容

时间:2015-05-29 05:29:46

标签: ios nsstring nsattributedstring

我正在尝试阅读我在.doc文件中包含的阿拉伯语文本,并在我的应用程序中使用它。不幸的是,我能够检索文本的唯一方法是将文档转换为.txt文件。

这是我的代码:

NSError *error = nil;
NSString *path = @"MyArabicDocument";
NSString *root = [[NSBundle mainBundle]pathForResource:path ofType:@"doc"];
NSString *myFile = [NSString stringWithContentsOfFile:root encoding:NSUTF8StringEncoding error:&error];

NSLog(@"my file contents are: %@", myFile);
NSLog(@"error is: %@", error);

我的NSString对象的输出是(null),我得到的错误是:

error is: Error Domain=NSCocoaErrorDomain Code=256 "The operation couldn’t be completed. (Cocoa error 256.)" UserInfo=0x7aace470 {NSFilePath=/Users/MyName/Library/Developer/CoreSimulator/Devices/.../data/Containers/Bundle/Application/..MyApp.app/MyArabicDocument.doc}

如果我将文档转换为.rtf格式,那么我的输出(在更改上面的代码块中的扩展名之后)如下:

my file contents are: {\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
{\fonttbl\f0\fnil\fcharset0 LucidaGrande;\f1\fnil\fcharset178 AlBayan;\f2\fnil\fcharset178 GeezaPro;
}
{\colortbl;\red255\green255\blue255;}
\vieww10800\viewh8400\viewkind0
\deftab709
\pard\pardeftab709\pardirnatural

\f0\fs46 \cf0 1
\f1  - \'de\'f3\'dc\'c7\'e1\'f3 \'c7\'c8\'fa\'dc\'e4\'f5 \'c2\'c8\'f3\'f8 \'e6\'f3\'c7\'d3\'fa\'e3\'f5\'dc\'e5\'f5 \'e3\'f5\'cd\'f3\'e3\'f3\'f8\'dc\'cf\'f5
\f0 ~~~
\f1 \'c7\'e1\'e1\'e5\'f3 \'dd\'f6\'dc\'ed \'df\'f5\'dc\'e1\'f6\'f8 \'c7\'e1\'c3\'f5\'e3\'f5\'dc\'e6\'d1\'f6 \'c3\'f3\'cd\'fa\'dc\'e3\'f3\'dc\'cf\'f5 \

...

如果我尝试使用NSAttributedString对象而不是NSString对象,但我仍然得到NSAttributedString对象的(null)值:

NSDictionary *attrs = @{NSDocumentTypeDocumentAttribute: NSRTFTextDocumentType, NSWritingDirectionAttributeName:@[@(NSWritingDirectionRightToLeft | NSTextWritingDirectionOverride)]};

NSAttributedString *text = [[NSAttributedString alloc] initWithFileURL:[[NSBundle mainBundle] URLForResource:@"MyArabicDocument" withExtension:@"doc"] options:attrs documentAttributes:nil error:&error];

这一点很重要的原因是,虽然我的阿拉伯语文本确实出现在我的应用程序中的UITextView中,但问题是它的外观远不如原始文档那么好,这就是我我想在我的应用程序中维护。这不可能吗?

2 个答案:

答案 0 :(得分:1)

有问题的.doc文件是二进制格式。 (可能像.docx一样压缩)

http://en.wikipedia.org/wiki/Doc_(computing)

所以你不能把它放在NSString中。但你可以获得NSData:

NSString *path = [[NSBundle mainBundle] pathForResource:@"MyArabicDocument" ofType:@"doc"];
NSData *data = [NSData dataWithContentsOfFile:path];

不幸的是,您无法在iOS中从.doc创建NSAttributedString,但您可以在OS X中(在iOS中只支持四种文档类型)

NSError *attrError;
NSDictionary *options = @{NSDocumentTypeDocumentAttribute: NSDocFormatTextDocumentType};
NSAttributedString *content = [[NSAttributedString alloc] initWithData:data options:options documentAttributes:nil error:&attrError];

相反,您可以尝试将.doc文件加载到WebView中。

使用NSData:

[self.webView loadData:data MIMEType:@"application/msword" textEncodingName:@"UTF-8" baseURL:nil];

但我认为NSURLRequest更好(因为你不需要在那里设置编码)

NSURL *url = [NSURL fileURLWithPath:path];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];

注意:您选择的任何方法很可能会破坏您的格式,我的意思是渲染文档会被破坏。相反,我建议将.doc转换为.pdf在这种情况下,它会很好。

例如,用于iOS的Dropbox应用程序将.doc / .docx转换为pdf,而不是以PDF格式呈现给用户(当然不会说它确实是PDF)。

答案 1 :(得分:0)

我认为您在阅读文件时遇到编码问题, 请参阅以下链接  https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Strings/Articles/readingFiles.html

可能会解决您的问题 祝你好运!