Créer un PDF multi-pages dans l'objective-c

J'essaye de créer un pdf de plusieurs pages. J'ai suivi ce tutoriel . Cela fonctionne avec un file XIB pour le text statique, puis ajoute une table à partir du code. Mais le problème que j'ai ATM est que lorsque la table est plus grande qu'une page. Lorsque la table a plus de 9 lignes. Cela devrait continuer à la page suivante.

C'est ce que je fais dans le code.

+(void)drawPDF:(NSSsortingng*)fileName { NSMutableDictionary *mutDictValues = [[[NSUserDefaults standardUserDefaults] objectForKey:@"dicValues"] mutableCopy]; NSMutableArray *arrSelectedCities = [[mutDictValues objectForKey:@"cities"]mutableCopy ]; if(arrSelectedCities.count <= 8){ // If there are only 8 rows --> we can fit everyting on one page ! // Create the PDF context using the default page size of 612 x 792. UIGraphicsBeginPDFContextToFile(fileName, CGRectZero, nil); // Mark the beginning of a new page. UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 612, 792), nil); [self drawLabels]; [self drawLogo]; int xOrigin = 50; int yOrigin = 350; int rowHeight = 50; int columnWidth = 240; int numberOfRows = 9; int numberOfColumns = 2; [self drawTableAt:CGPointMake(xOrigin, yOrigin) withRowHeight:rowHeight andColumnWidth:columnWidth andRowCount:numberOfRows andColumnCount:numberOfColumns]; [self drawTableDataAt:CGPointMake(xOrigin, yOrigin) withRowHeight:rowHeight andColumnWidth:columnWidth andRowCount:numberOfRows andColumnCount:numberOfColumns withArray:arrSelectedCities]; // Close the PDF context and write the contents out. UIGraphicsEndPDFContext(); }else{ // When we have more then 8 rows we should have 2 pages. NSLog(@"Create 2 pages"); // Create the PDF context using the default page size of 612 x 792. UIGraphicsBeginPDFContextToFile(fileName, CGRectZero, nil); // Mark the beginning of a new page. UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 612, 792), nil); [self drawLabels]; [self drawLogo]; int xOrigin = 50; int yOrigin = 350; int rowHeight = 50; int columnWidth = 240; int numberOfRows = 9; int numberOfColumns = 2; [self drawTableAt:CGPointMake(xOrigin, yOrigin) withRowHeight:rowHeight andColumnWidth:columnWidth andRowCount:numberOfRows andColumnCount:numberOfColumns]; [self drawTableDataAt:CGPointMake(xOrigin, yOrigin) withRowHeight:rowHeight andColumnWidth:columnWidth andRowCount:numberOfRows andColumnCount:numberOfColumns withArray:arrSelectedCities]; // Create the PDF context using the default page size of 612 x 792. UIGraphicsBeginPDFContextToFile(fileName, CGRectZero, nil); // Mark the beginning of a new page. UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 612, 792), nil); int xOrigin2 = 50; int yOrigin2 = 60; int numberOfRows2 = ((arrSelectedCities.count+1)-9); [self drawTableAt:CGPointMake(xOrigin2, yOrigin2) withRowHeight:rowHeight andColumnWidth:columnWidth andRowCount:numberOfRows2 andColumnCount:numberOfColumns]; [self drawTableDataAt:CGPointMake(xOrigin2, yOrigin2) withRowHeight:rowHeight andColumnWidth:columnWidth andRowCount:numberOfRows2 andColumnCount:numberOfColumns withArray:arrSelectedCities]; } // Close the PDF context and write the contents out. UIGraphicsEndPDFContext(); } 

Laissez-moi vous expliquer ce que je fais ici. J'ai un tableau qui devrait remplir mon tableview. Si le tableau est plus grand que 8 alors je devrais utiliser 2 pages. Sinon, tout fonctionne avec une page.

Qu'est-ce que cela fait, c'est créer seulement la deuxième page ….

Quelqu'un peut-il m'aider?

Vous ne devriez pas appeler à nouveau UIGraphicsBeginPDFContextToFile() lors de la création de la deuxième page, seulement UIGraphicsBeginPDFPageWithInfo() :

 UIGraphicsBeginPDFContextToFile(...); UIGraphicsBeginPDFPageWithInfo(...); // start first page // ... UIGraphicsBeginPDFPageWithInfo(...); // start second page // ... UIGraphicsEndPDFContext(); 
 NSArray *imageArray = [NSArray arrayWithObjects:[UIImage imageNamed:@"3.png"], [UIImage imageNamed:@"4.png"], [UIImage imageNamed:@"5.png"], [UIImage imageNamed:@"3.png"], nil]; NSMutableData *pdfFile = [[NSMutableData alloc] init]; double pageWidth = 0.0; double pageHeight = 0.0; UIImage *image; for (int i = 0; i < [imageArray count]; i++) { image =[UIImage imageWithCGImage:[imageArray[i] CGImage]]; pageWidth = pageWidth + image.size.width ; pageHeight = pageHeight + image.size.height; } image =[UIImage imageWithCGImage:[imageArray[0] CGImage]]; CGRect rect; rect = CGRectMake(0, 0,image.size.width ,image.size.height); UIGraphicsBeginPDFContextToData(pdfFile, CGRectZero, nil); for (int i = 0; i < [imageArray count] ; i++) { UIGraphicsBeginPDFPageWithInfo(rect, nil); UIImage *contextImage = imageArray[i]; [contextImage drawInRect:rect]; } UIGraphicsEndPDFContext(); // save PDF file NSSsortingng *saveFileName = [NSSsortingng ssortingngWithFormat:@"%@%fx%f.pdf", @"test", pageWidth, pageHeight]; NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); NSSsortingng* documentDirectory = [documentDirectories objectAtIndex:0]; NSSsortingng* savePath = [documentDirectory ssortingngByAppendingPathComponent:saveFileName]; if([[NSFileManager defaultManager] fileExistsAtPath:savePath]) { [[NSFileManager defaultManager] removeItemAtPath:savePath error:nil]; } [pdfFile writeToFile: savePath atomically: YES]; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"PDF File created and saved successfully." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [alert show]; 

Vous n'avez pas besoin de créer un context pour la deuxième page ( UIGraphicsBeginPDFContextToFile(fileName, CGRectZero, nil) ), vous devez uniquement créer cette page. Vous devriez également vous souvenir de la fermeture de la page ouverte en utilisant CGPDFContextEndPage() .

 - (void)viewDidLoad { [super viewDidLoad]; [self createPDF]; } - (void)createPDF { [self setupPDFDocumentNamed:@"myPdf" Width:850 Height:1100]; [self beginPDFPage]; } - (void)beginPDFPage { UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, pageSize.width, pageSize.height), nil); // kPadding will make 20 points margin on both sides of pdf CGRect textRect = [self addText:@"Line Text Testing" withFrame:CGRectMake(PdfPadding, PdfPadding, 400, 200) fontSize:48.0f]; textRect = [self addLineWithFrame:CGRectMake(PdfPadding, textRect.origin.y + textRect.size.height +PdfPadding, pageSize.width - PdfPadding*2, 4) withColor:[UIColor blueColor]]; UIImage *anImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithSsortingng:@"https://www.phantompeer.com/sitefiles/osx.png"]]]; textRect = [self addImage:anImage atPoint:CGPointMake((pageSize.width/2)-(anImage.size.width/2),textRect.origin.y + textRect.size.height + PdfPadding)]; textRect = [self addLineWithFrame:CGRectMake(PdfPadding, textRect.origin.y + textRect.size.height + PdfPadding, pageSize.width - PdfPadding*2, 4) withColor:[UIColor redColor]]; textRect = [self addText:@"Line Text Testing" withFrame:CGRectMake(PdfPadding, textRect.origin.y + textRect.size.height + PdfPadding, 400, 200) fontSize:48.0f]; textRect = [self addLineWithFrame:CGRectMake(PdfPadding, textRect.origin.y + textRect.size.height +PdfPadding, pageSize.width - PdfPadding*2, 4) withColor:[UIColor blueColor]]; anImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithSsortingng:@"http://img.iosberry.com/iphone/img_fjords.jpg"]]]; textRect = [self addImage:anImage atPoint:CGPointMake((pageSize.width/2)-(anImage.size.width/2),textRect.origin.y + textRect.size.height + PdfPadding)]; textRect = [self addLineWithFrame:CGRectMake(PdfPadding, textRect.origin.y + textRect.size.height + PdfPadding, pageSize.width - PdfPadding*2, 4) withColor:[UIColor redColor]]; UIGraphicsEndPDFContext(); [self loadRemotePdf]; } -(CGRect)addText:(NSSsortingng*)text withFrame:(CGRect)frame fontSize:(float)fontSize { UIFont *font = [UIFont systemFontOfSize:fontSize]; CGSize ssortingngSize = [text sizeWithFont:font constrainedToSize:CGSizeMake(pageSize.width - 2*20-2*20, pageSize.height - 2*20 - 2*20) lineBreakMode:UILineBreakModeWordWrap]; if((frame.origin.y + ssortingngSize.height + PdfPadding) > pageSize.height) { frame = CGRectMake(frame.origin.x, PdfPadding, frame.size.width, frame.size.height); UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, pageSize.width, pageSize.height), nil); } float textWidth = frame.size.width; if (textWidth < ssortingngSize.width) textWidth = ssortingngSize.width; if (textWidth > pageSize.width) textWidth = pageSize.width - frame.origin.x; CGRect renderingRect = CGRectMake(frame.origin.x, frame.origin.y, textWidth, ssortingngSize.height); [text drawInRect:renderingRect withFont:font lineBreakMode:NSLineBreakByWordWrapping alignment:NSTextAlignmentLeft]; frame = CGRectMake(frame.origin.x, frame.origin.y, textWidth, ssortingngSize.height); return frame; } -(CGRect)addLineWithFrame:(CGRect)frame withColor:(UIColor*)color { if((frame.origin.y + frame.size.height+PdfPadding) > pageSize.height) { frame = CGRectMake(frame.origin.x, PdfPadding, frame.size.width, frame.size.height); UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, pageSize.width, pageSize.height), nil); } CGContextRef currentContext = UIGraphicsGetCurrentContext(); CGContextSetStrokeColorWithColor(currentContext, color.CGColor); // this is the thickness of the line CGContextSetLineWidth(currentContext, frame.size.height); CGPoint startPoint = frame.origin; CGPoint endPoint = CGPointMake(frame.origin.x + frame.size.width, frame.origin.y); CGContextBeginPath(currentContext); CGContextMoveToPoint(currentContext, startPoint.x, startPoint.y); CGContextAddLineToPoint(currentContext, endPoint.x, endPoint.y); CGContextClosePath(currentContext); CGContextDrawPath(currentContext, kCGPathFillStroke); return frame; } -(CGRect)addImage:(UIImage*)image atPoint:(CGPoint)point { CGRect imageFrame = CGRectMake(point.x, point.y, image.size.width, image.size.height); if((imageFrame.origin.y + imageFrame.size.height + PdfPadding) > pageSize.height) { imageFrame = CGRectMake(imageFrame.origin.x, PdfPadding, imageFrame.size.width, imageFrame.size.height); UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, pageSize.width, pageSize.height), nil); } [image drawInRect:imageFrame]; return imageFrame; } - (void) loadRemotePdf { CGRect rect = [[UIScreen mainScreen] bounds]; CGSize screenSize = rect.size; NSSsortingng *newPDFName = [NSSsortingng ssortingngWithFormat:@"myPdf.pdf"]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); NSSsortingng *documentsDirectory = [paths objectAtIndex:0]; NSSsortingng *pdfPath = [documentsDirectory ssortingngByAppendingPathComponent:newPDFName]; UIWebView *myWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0,0,screenSize.width,screenSize.height)]; myWebView.autoresizesSubviews = YES; myWebView.autoresizingMask=(UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth); NSURL *myUrl = [NSURL fileURLWithPath:pdfPath]; NSURLRequest *myRequest = [NSURLRequest requestWithURL:myUrl]; [myWebView loadRequest:myRequest]; [self.view addSubview: myWebView]; } 

Pour créer une nouvelle page dans le pdf, utilisez

 UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, pageSize.width, pageSize.height), nil);