2016-03-11 7 views
5

Я преобразования UIWebView в PDF/изображение с помощью следующего кода:Преобразование UIWebView в PDF/Image дает только один дюйм широкий выход

NSString *heightStr = [webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"]; 

    int height = [heightStr intValue]; 
    CGFloat screenHeight = webView.bounds.size.height; 
    int pages = ceil(height/screenHeight); 

    NSMutableData *pdfData = [NSMutableData data]; 
    UIGraphicsBeginPDFContextToData(pdfData, webView.bounds, nil); 
    CGRect frame = [webView frame]; 
    NSMutableArray *imageArray= [[NSMutableArray alloc]init]; 

    for (int i = 0; i < pages; i++) 
    { 
     // Check to screenHeight if page draws more than the height of the UIWebView 
     if ((i+1) * screenHeight > height) 
     { 
      CGRect f = [webView frame]; 
      f.size.height -= (((i+1) * screenHeight) - height); 
      [webView setFrame: f]; 
     } 
     UIGraphicsBeginImageContext(frame.size); 

     UIGraphicsBeginPDFPage(); 
     CGContextRef currentContext = UIGraphicsGetCurrentContext(); 
     //CGContextTranslateCTM(currentContext, 72, 72); // Translate for 1" margins 

     [[[webView subviews] lastObject] setContentOffset:CGPointMake(0, screenHeight * i) animated:NO]; 
     [webView.layer renderInContext:currentContext]; 


     UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
     [imageArray insertObject:viewImage atIndex:imageArray.count] ; 

     UIGraphicsEndImageContext(); 
    } 

    UIGraphicsEndPDFContext(); 

    [webView setFrame:frame]; 

    //Send all images 
    NSData *imgData = [self blendImages:imageArray]; 

    //Final Image 
    UIImage *finalImage = [UIImage imageWithData:imgData]; 

-(NSData*)blendImages:(NSMutableArray *)arrImage{ 
    // get data from document 

    CGFloat height=0 ,width=0 ; 
    UIImage *tempImg = [arrImage objectAtIndex:0] ; 
    width =tempImg.size.width ; 

    for (int i = 0 ; i<arrImage.count ; i++){ 
     UIImage *img= [arrImage objectAtIndex:i]; 
     height = img.size.height +height; 
    } 
    CGSize size = CGSizeMake(width, height) ; 
    UIGraphicsBeginImageContext(size); 
    CGFloat h = 0; 
    for (int i=0; i<arrImage.count; i++) { 
     UIImage* uiimage = [arrImage objectAtIndex:i]; 
     [uiimage drawAtPoint:CGPointMake(0, h) blendMode:kCGBlendModeNormal alpha:1.0]; 
     h = uiimage.size.height +h ; 
    } 
    NSData *imageData = UIImagePNGRepresentation(UIGraphicsGetImageFromCurrentImageContext()); 
    UIGraphicsEndImageContext(); 

    return imageData; 
} 

Но я получаю только один дюйм шириной вывод. Кроме того, целое содержит вставки на одной странице и делает его нечитаемым. Как сделать выход формата A4?

+0

Я играл немного с вашим кодом. Мне непонятно, чего вы пытаетесь достичь. Вы хотите создать pdf-файл с несколькими страницами, на каждой странице размером A4? Или вы пытаетесь создать одиночное изображение со всей веб-страницы, например, ваш код в настоящее время ведет себя, но изменить размер результата? –

+0

@BorisVerebsky: Я хочу создать с несколькими страницами. – Poles

ответ

0

Это создает PDF на скриншот веб-страницы - может помочь вам начать работу :)

- (IBAction)makePDF:(id)sender 
    { 
     UIGraphicsBeginImageContextWithOptions(webView.scrollView.contentSize, webView.scrollView.opaque, 0.0); 

     webView.scrollView.contentOffset = CGPointZero; 
     webView.scrollView.frame = CGRectMake(0, 0, webView.scrollView.contentSize.width, webView.scrollView.contentSize.height); 
     [webView.scrollView.layer renderInContext: UIGraphicsGetCurrentContext()]; 
     UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

     CGRect imageFrame = CGRectMake(0, 0, image.size.width, image.size.height); 

     NSMutableData *pdfData = [NSMutableData data]; 
     UIGraphicsBeginPDFContextToData(pdfData, imageFrame, nil); 

     //full screenshot 
     UIGraphicsBeginPDFPage(); 
     UIImageView *imageView = [[UIImageView alloc] initWithFrame:imageFrame]; 
     [imageView setContentMode:UIViewContentModeScaleAspectFit]; 
     [imageView setImage:image]; 
     [imageView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
     UIGraphicsEndPDFContext(); 

     NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); 
     NSString *documentDirectory = [documentDirectories objectAtIndex:0]; 
     NSString *fileName = [NSString stringWithFormat:@"%@.pdf",[NSDate date]]; 
     NSString *path = [documentDirectory stringByAppendingPathComponent:fileName]; 

     // save to disk 
     [pdfData writeToFile:path atomically:YES]; 
     NSLog(@"pdf in %@", path); 
    }