將UIWebView顯示的內容轉爲圖片和PDF

今天開發MarkEditor時要用到將 UIWebView 中顯示的內容轉爲圖片,方便轉發到各個社交網絡(Twiiter,Facebook,Weibo),這樣內容就不受長度限制,相似於長微博。 以前關於視圖轉圖片我知道能夠經過 QuartzCore 裏截圖的形式,可是截圖只能截取當前屏幕所顯示的區域 (UIGraphicsGetCurrentContext()),而 UIWebView 的內容可能比屏幕長得多,在網上搜了一下,沒有找到更好的方法,全部只用將 UIWebView 分屏截取,而後將截取的圖片拼接成一張圖片。git

 

- (UIImage *)imageRepresentation{
    CGSize boundsSize = self.bounds.size;
    CGFloat boundsWidth = self.bounds.size.width;
    CGFloat boundsHeight = self.bounds.size.height;
    
    CGPoint offset = self.scrollView.contentOffset;
    [self.scrollView setContentOffset:CGPointMake(0, 0)];
    
    CGFloat contentHeight = self.scrollView.contentSize.height;
    NSMutableArray *images = [NSMutableArray array];
    while (contentHeight > 0) {
        UIGraphicsBeginImageContext(boundsSize);
        [self.layer renderInContext:UIGraphicsGetCurrentContext()];
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        [images addObject:image];
        
        CGFloat offsetY = self.scrollView.contentOffset.y;
        [self.scrollView setContentOffset:CGPointMake(0, offsetY + boundsHeight)];
        contentHeight -= boundsHeight;
    }
    [self.scrollView setContentOffset:offset];
    
    UIGraphicsBeginImageContext(self.scrollView.contentSize);
    [images enumerateObjectsUsingBlock:^(UIImage *image, NSUInteger idx, BOOL *stop) {
        [image drawInRect:CGRectMake(0, boundsHeight * idx, boundsWidth, boundsHeight)];
    }];
    UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return fullImage;
}

 

將 UIWebView 從頭,contentOffset = (0, 0),開始截取webView.bounds.size.height高度的圖片,而後將 _webView 可見區域下移繼續截屏,這樣將全部截取的圖片按照順序拼接,就能獲得整個 UIWebView 顯示內容的完整圖片。(不知道有沒有更好的方法)github


本覺得用一樣的方法就能生成 PDF 文件web

imageimage瀏覽器

可是經過UIGraphics生成的 PDF 其實就是圖片,文字都無法選中,並且質量也不高,因此繼續查找其餘方法。發現UIPrintPageRenderer能夠實現渲染視圖繪製的內容。網絡

 

- (NSData *)PDFData{
    UIViewPrintFormatter *fmt = [self viewPrintFormatter];
    UIPrintPageRenderer *render = [[UIPrintPageRenderer alloc] init];
    [render addPrintFormatter:fmt startingAtPageAtIndex:0];
    CGRect page;
    page.origin.x=0;
    page.origin.y=0;
    page.size.width=600;
    page.size.height=768;
    
    CGRect printable=CGRectInset( page, 50, 50 );
    [render setValue:[NSValue valueWithCGRect:page] forKey:@"paperRect"];
    [render setValue:[NSValue valueWithCGRect:printable] forKey:@"printableRect"];
    
    NSMutableData * pdfData = [NSMutableData data];
    UIGraphicsBeginPDFContextToData( pdfData, CGRectZero, nil );
    
    for (NSInteger i=0; i < [render numberOfPages]; i++)
    {
        UIGraphicsBeginPDFPage();
        CGRect bounds = UIGraphicsGetPDFContextBounds();
        [render drawPageAtIndex:i inRect:bounds];
        
    }
    UIGraphicsEndPDFContext();
    return pdfData;
}

經過這種方式生成的 PDF 質量高,與瀏覽器「打印」功能顯示出的內容同樣ui

 

image1image1spa


代碼已上傳 github (https://github.com/tracy-e/UIWebViewToFile)code

======== 全文完 ============orm

Posted by XiaoYi_HD - 6月 10 2013
如需轉載,請註明: 本文來自 Esoft Mobile圖片

相關文章
相關標籤/搜索