2011-03-11 67 views
3

我想生成一个内容大小约320 * 2000的UIScrollView的pdf。如果我使用当前图形图像上下文来捕获滚动视图图层,那么它仅捕获滚动视图的可见部分而不是该滚动视图的整个图层。PDF生成从UIScrollView + iphone

我使用下面的代码:

-(void)CreatePdf:(id)sender 
{ 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *saveDirectory = [paths objectAtIndex:0]; 
    NSString *saveFileName = @"myPDF.pdf"; 
    [self writePDFAma]; 
    CGRect arect=CGRectMake(0, 0, 768, 1024); 

    CreatePDFFileAma(arect, nil); 
} 



-(void) writePDFAma 
{ 
    UIImage *image; 
    NSData *data; 
    UIAlertView *successAlert; 
    UIAlertView *failureAlert; 
    // 
    NSArray *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    // // This should be our documents directory 
    NSString *saveDiirectory = [documentPath objectAtIndex:0]; 
    // // Our PDF is named 'Example.pdf' 
    NSString *saveFileName = @"FormImage2.JPG"; 
    // // Create the full path using our saveDirectory and saveFileName 
    NSString *finalPath = [saveDiirectory stringByAppendingPathComponent:saveFileName]; 
    //NSLog(@"%@",finalPath); 
    CGSize asize=CGSizeMake(_scrollview.frame.size.width, _scrollview.frame.size.height); 
    //NSLog(@"%d..%d",mainViewAma.frame.size.width, mainViewAma.frame.size.height); 
    UIGraphicsBeginImageContext(asize); 
     [[_scrollview layer] renderInContext:UIGraphicsGetCurrentContext()]; 
image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    data = UIImageJPEGRepresentation(image, 1.0); 

    BOOL catch; 
    if(!catch){ 
     if ([[NSFileManager defaultManager] createFileAtPath:finalPath contents:data attributes:nil]) 
     { 
      successAlert = [[UIAlertView alloc] initWithTitle:@"Success" message:@"Doodle was successfully saved to the Photo Library." delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil]; 
      //[successAlert show]; 
      [successAlert release]; 
     } else { 
      failureAlert = [[UIAlertView alloc] initWithTitle:@"Failure" message:@"Failed to save doodle to the Photo Library." delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil]; 
      //[failureAlert show]; 
      [failureAlert release]; 
     } 

    } 

} 


void CreatePDFFileAma (CGRect pageRect, const char *filename) 
{ 
    // This code block sets up our PDF Context so that we can draw to it 
    //some code here 
    CGContextRef pdfContext; 
    CFURLRef url; 
    CFMutableDictionaryRef myDictionary = NULL; 
    NSArray *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    // // This should be our documents directory 
    NSString *saveDirectory = [documentPath objectAtIndex:0]; 
    // // Our PDF is named 'Example.pdf' 



    //NSString *saveFileName = @"PDFForm2.pdf"; 



    // // Create the full path using our saveDirectory and saveFileName 
    NSString *finalPath = [saveDirectory stringByAppendingPathComponent:saveFileName]; 
    NSURL * aurl=[[NSURL alloc]initFileURLWithPath:finalPath]; 
    url=(CFURLRef)aurl; 
    // This dictionary contains extra options mostly for 'signing' the PDF 
    myDictionary = CFDictionaryCreateMutable(NULL, 0, 
              &kCFTypeDictionaryKeyCallBacks, 
              &kCFTypeDictionaryValueCallBacks); 
    CFDictionarySetValue(myDictionary, kCGPDFContextTitle, CFSTR("AMA FORM PDF")); 
    CFDictionarySetValue(myDictionary, kCGPDFContextCreator, CFSTR("My Name2")); 
    // Create our PDF Context with the CFURL, the CGRect we provide, and the above defined dictionary 
    pdfContext = CGPDFContextCreateWithURL (url, &pageRect, myDictionary); 
    // Cleanup our mess 
    CFRelease(myDictionary); 
    CFRelease(url); 
    // Starts our first page 
    CGContextBeginPage (pdfContext, &pageRect); 

    // Draws a black rectangle around the page inset by 50 on all sides 
    CGContextStrokeRect(pdfContext, CGRectMake(50, 50, 768, 1024)); 

    // This code block will create an image that we then draw to the page 
    CGImageRef image; 
    CGDataProviderRef provider; 
    CFURLRef pictureURL; 
    documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    // // This should be our documents directory 
    saveDirectory = [documentPath objectAtIndex:0]; 
    NSString *saveFileName2 = @"FormImage2.JPG"; 
    // // Create the full path using our saveDirectory and saveFileName 
    NSString *finalPath2 = [saveDirectory stringByAppendingPathComponent:saveFileName2]; 
    NSURL * aurl2=[[NSURL alloc]initFileURLWithPath:finalPath2]; 
    pictureURL=(CFURLRef)aurl2; 
    provider = CGDataProviderCreateWithURL (pictureURL); 
    CFRelease (pictureURL); 
    image = CGImageCreateWithJPEGDataProvider(provider, NULL, TRUE, kCGRenderingIntentDefault); //DataProvider (, NULL, true, kCGRenderingIntentDefault); 
    CGDataProviderRelease (provider); 
    CGContextDrawImage (pdfContext, CGRectMake(0, 0,768, 1024),image); 
    CGImageRelease (image); 
    CGContextEndPage (pdfContext); 
    // We are done with our context now, so we release it 
    CGContextRelease (pdfContext); 
} 

回答

0

是有可能看到你的示例代码,请,我试图做同样的事情准确。

,你可以在这里发送的源代码,感谢你会很慷慨 [email protected]

反正你的问题,也许这可以帮助:

您捕捉可见内容只是因为您的滚动视图的大小只与可见内容匹配,应该是。您需要调整您的滚动视图你需要捕捉的内容相匹配你使用这样的事情开始绘图代码之前:

代码:“在这里你的内容宽度” self.scrollView.frame = CGRectMake(0,0, ,“你在这里的内容高度”); 后您完成绘制一定要调整你的滚动视图来支持,在这种情况下,容器视图:

代码: self.scrollView.frame = CGRectMake(0,0,self.view.frame.size .width,self.view.frame.size.height);

+0

喜马可,我试图通过implimenting你的逻辑,但它不为我工作。 – ravoorinandan 2012-02-22 09:06:59

7

嘿,大家好,我准备了一些代码库使用实例可在网创建的UIScrollView PDF我们应该清楚两件事

1)页数2)contentsize 滚动型

我已经创建了内容大小(10 * 910)的滚动视图。所以它有10页。。这是iPad。

这里是代码库

- (void) createPDF 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *directroyPath = nil; 
    directroyPath = [documentsDirectory stringByAppendingPathComponent:@"PDF"]; 
    NSString *filePath = [directroyPath stringByAppendingPathComponent:@"test.pdf"]; 
    // check for the "PDF" directory 
    NSError *error; 
    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { 

    } else { 
     [[NSFileManager defaultManager] createDirectoryAtPath:directroyPath 
            withIntermediateDirectories:NO 
                attributes:nil 
                 error:&error]; 
    } 

    CGContextRef pdfContext = [self createPDFContext:myScrollView.bounds path:(CFStringRef)filePath]; 
    NSLog(@"PDF Context created"); 

    for (int i = 0 ; i< 10 ; i++) 
    { 

     // page 1 
     CGContextBeginPage (pdfContext,nil); 

     //turn PDF upsidedown 
     CGAffineTransform transform = CGAffineTransformIdentity;  
     transform = CGAffineTransformMakeTranslation(0, (i+1) * 910); 
     transform = CGAffineTransformScale(transform, 1.0, -1.0); 
     CGContextConcatCTM(pdfContext, transform); 

     //Draw view into PDF 
     [myScrollView.layer renderInContext:pdfContext];  
     CGContextEndPage (pdfContext);   
     [myScrollView setContentOffset:CGPointMake(0, (i+1) * 910) animated:NO]; 

    } 
    CGContextRelease (pdfContext); 
} 

- (CGContextRef) createPDFContext:(CGRect)inMediaBox path:(CFStringRef) path  
{ 
    CGContextRef myOutContext = NULL; 
    CFURLRef url; 
    url = CFURLCreateWithFileSystemPath (NULL, path,           
             kCFURLPOSIXPathStyle,          
             false); 

    if (url != NULL) {  
     myOutContext = CGPDFContextCreateWithURL (url, 
                &inMediaBox,             
                NULL);   
     CFRelease(url);  
    } 
    return myOutContext; 
} 
+0

嗨Nikesh,我尝试了你的代码,但是我创建的pdf显然被破坏了,因为预览和Acrobat都无法打开它...你有什么想法吗? – Faser 2012-07-24 10:24:15

+1

@UrbanSeifert是否为.pdf文件扩展名指定您的pdf文件的名称? – Bek 2012-09-10 16:53:04

+0

@ Nikesh ..感谢您的代码。它完美的工作,但有一个问题,因为我的网页没有改变比显示控制器也打破。例如。我在第2页,有一个按钮,它是第1页的半部分,第2页的一半。有没有解决方案? – Abha 2016-07-27 07:18:44

5

我想出了一个不同的解决方案:

-(NSData*)pdfDataFromTableViewContent{ 
    NSMutableData *pdfData = [NSMutableData data]; 
    //The real size, not only the visible part 
    CGSize contentSize = self.tableView.contentSize; 
    CGRect tableViewRealFrame = self.tableView.frame; 
    //Size tableView to show the whole content 
    self.tableView.frame = CGRectMake(0, 0, contentSize.width, contentSize.height); 
    //Generate PDF (one page) 
    UIGraphicsBeginPDFContextToData(pdfData,self.tableView.frame, nil); 
    UIGraphicsBeginPDFPage(); 
    [self.tableView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIGraphicsEndPDFContext(); 
    //Resize frame 
    self.tableView.frame = tableViewRealFrame; 
    return pdfData;} 

大小以适合滚动视图的全部内容框架,捕捉它在graphicsContext,大小回框架。

上面的代码生成一个页面。
对于多页我基本上使用这样的:

//MultiPage 
CGRect mediaBox = self.tableView.frame; 
CGSize pageSize = CGSizeMake(self.view.frame.size.width, 800); 
UIGraphicsBeginPDFContextToData(pdfData, CGRectZero, nil); 
CGContextRef pdfContext = UIGraphicsGetCurrentContext(); 
NSInteger currentPage = 0; 
BOOL done = NO; 
do { 
    UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0.0, pageSize.width, pageSize.height), nil); 
    CGContextTranslateCTM(pdfContext, 0, -(pageSize.height*currentPage)); 
    [self.view.layer renderInContext:pdfContext]; 
    if ((pageSize.height*(currentPage+1)) > mediaBox.size.height) done = YES; 
    else currentPage++; 
} while (!done); 
UIGraphicsEndPDFContext();