5

I'm converting a UIWebView to pdf/image with the help of the following code:

    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;
}

But I'm getting only one inch wide output. Also the whole contains fits in one page and make it unreadable. How to make A4 sized output?

Poles
  • 3,585
  • 9
  • 43
  • 91
  • I've played a bit with your code. It's unclear for me what are you trying to achieve. Do you want to create pdf with multiple pages, each page A4 sized? Or you are trying to create single image from whole web page, like your code currently behaves, but change result size? – Borys Verebskyi Mar 19 '16 at 10:38
  • @BorisVerebsky: I want to create with multiple pages. – Poles Mar 22 '16 at 05:47

1 Answers1

0

This creates a PDF of a screenshot of a webpage - might help get you started :)

  - (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);
  }
dOM
  • 555
  • 5
  • 14