无法读取 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)。
我正在尝试阅读包含在 .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)。