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

Unable to read contents of .doc file in iOS

我正在尝试阅读包含在 .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 对象仍然得到一个(空)值:

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 中,但问题是它的外观远不如原始文档中的漂亮,而这正是我想要的在我的应用程序中维护。这不可能吗?

我认为您在读取文件时遇到了编码问题, 参考下面 link https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Strings/Articles/readingFiles.html

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

.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 应用程序 defenetly 将 .doc/.docx 转换为 pdf,然后以 PDF 格式呈现给用户(当然不会说它确实是 PDF)。