从UIScrollView + iphone生成PDF [英] PDF Generation From UIScrollView + iphone

查看:98
本文介绍了从UIScrollView + iphone生成PDF的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to generate a pdf of UIScrollView whose content size is near about 320*2000. If I use current graphic image context to capture the scroll view layer, then it only captures the visible part of the scroll view not the whole layer of that scroll view.

I我使用以下代码:

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


推荐答案

嘿伙计们,我准备了一些代码库使用网上提供的示例从UIScrollView创建PDF
我们应该清楚两件事

Heh guys, i prepared some code base using the examples available on net to create PDF from UIScrollView We should be clear about two things


1)第2页)
scrollview的内容大小

1) number of pages 2) contentsize of scrollview

我创建了内容大小(10 * 910)的滚动视图。所以它有10页。。适用于iPad。

i have created a scroll view of content size ( 10 * 910). so it has 10 pages.. This is for 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;
}

这篇关于从UIScrollView + iphone生成PDF的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆