Можно ли получить изображение большого пальца из документа .doc или .xls? - PullRequest
2 голосов
/ 12 декабря 2011

Я ищу создание эскиза изображения со страницы документа MS doc / xls, но я ничего не нашел об этом.

Для PDF-документов я использовал Quarz Framework, но не могу в этом случае.

Некоторая помощь?

1 Ответ

6 голосов
/ 12 декабря 2011

Для просмотра в формате MS можно использовать веб-представление.

Я однажды пытался сделать это с помощью этого кода.Это работает ... но ... веб-представление должно работать в графическом потоке, поэтому при выполнении этой операции ваш интерфейс работает медленнее.Может быть, вы можете оптимизировать это.

Заголовок

@interface WebViewThumbnailGenerationOperation: NSOperation <UIWebViewDelegate> {
    BOOL finished;
}
@property(nonatomic,retain) NSURL* documentURL;
@property(nonatomic,retain) UIWebView* webView;

-(void)saveThumbnail:(UIImage*)thumbnail;

@end

Код

/**************************************************************************************************/
#pragma mark - WebViewBased Thumbnails

@implementation WebViewThumbnailGenerationOperation

@synthesize documentURL,webView;

-(void)dealloc {
    RELEASE_SAFELY(documentURL);
    [super dealloc];
}


- (void)loadWebView {
    if (self.isCancelled) {
        return;
    }
    self.webView = [[[UIWebView alloc] init] autorelease];
    self.webView.delegate = self;
    self.webView.scalesPageToFit = YES;
    self.webView.frame = CGRectMake(0, 0, 290, 290);
    NSURLRequest *request = [NSURLRequest requestWithURL:documentURL];
    [self.webView loadRequest:request];    
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    if (self.isCancelled) {
        return;
    }
    UIGraphicsBeginImageContext(CGSizeMake(290,290));
    CGContextRef context = UIGraphicsGetCurrentContext();
    [self.webView.layer renderInContext:context];
    UIImage *thumbnail = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [self performSelectorInBackground:@selector(saveThumbnail:) withObject:thumbnail];

    self.webView = nil;
}

-(void)saveThumbnail:(UIImage*)thumbnail {
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    if (self.isCancelled) {
        return;
    }

    if(!thumbnail) {
        return;
    }

    NSData* thumbnailData = UIImageJPEGRepresentation(thumbnail,0.8);
    [IOHelper saveThumbnailData:thumbnailData forDocumentURL:documentURL];

    [self willChangeValueForKey:@"isFinished"];
    finished = YES;
    [self didChangeValueForKey:@"isFinished"];

    [pool release];
}

-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    NSLog(@"Preview failed for %@ error %@",document.name,error);
    [self willChangeValueForKey:@"isFinished"];
    finished = YES;
    [self didChangeValueForKey:@"isFinished"];
    self.webView = nil;
}

-(void)start {
    finished = NO;
    [super start];
}

- (void)main {
    if (self.isCancelled) {
        return;
    }
    [self performSelectorOnMainThread:@selector(loadWebView) withObject:nil waitUntilDone:YES];
}

-(BOOL)isFinished {
    return finished;
}

@end

Редактировать: Версия ARC!

Заголовок

@interface WebViewThumbnailGenerationOperation: NSOperation <UIWebViewDelegate>

@property(nonatomic, strong) NSURL* documentURL;
@property(nonatomic, strong) UIWebView* webView;
@property(nonatomic) BOOL finished;


-(void)saveThumbnail:(UIImage*)thumbnail;

@end

Код

/**************************************************************************************************/
#pragma mark - WebViewBased Thumbnails

@implementation WebViewThumbnailGenerationOperation

- (void)loadWebView {
    if (self.isCancelled) {
        return;
    }
    self.webView = [[UIWebView alloc] init];
    self.webView.delegate = self;
    self.webView.scalesPageToFit = YES;
    self.webView.frame = CGRectMake(0, 0, 290, 290);
    NSURLRequest *request = [NSURLRequest requestWithURL:documentURL];
    [self.webView loadRequest:request];    
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    if (self.isCancelled) {
        return;
    }
    UIGraphicsBeginImageContext(CGSizeMake(290,290));
    CGContextRef context = UIGraphicsGetCurrentContext();
    [self.webView.layer renderInContext:context];
    UIImage *thumbnail = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [self performSelectorInBackground:@selector(saveThumbnail:) withObject:thumbnail];

    self.webView = nil;
}

-(void)saveThumbnail:(UIImage*)thumbnail {
    @autoreleasepool {
        if (self.isCancelled) {
            return;
        }

        if(!thumbnail) {
            return;
        }

        NSData* thumbnailData = UIImageJPEGRepresentation(thumbnail,0.8);
        [IOHelper saveThumbnailData:thumbnailData forDocumentURL:documentURL];

        [self willChangeValueForKey:@"isFinished"];
        finished = YES;
        [self didChangeValueForKey:@"isFinished"];

    }
}

-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    NSLog(@"Preview failed for %@ error %@", document.name, error);
    [self willChangeValueForKey:@"isFinished"];
    finished = YES;
    [self didChangeValueForKey:@"isFinished"];
    self.webView = nil;
}

-(void)start {
    finished = NO;
    [super start];
}

- (void)main {
    if (self.isCancelled) {
        return;
    }
    [self performSelectorOnMainThread:@selector(loadWebView) withObject:nil waitUntilDone:YES];
}

-(BOOL)isFinished {
    return finished;
}

@end
...