2013-05-07 24 views
6

Çok sayfalı bir PDF oluşturmaya çalışıyorum. Bu tutorial'u takip ettim. Bu, statik metin için bir XIB dosyası ile çalışıyor ve daha sonra koddan bir tablo ekler. Ama ATM'ye sahip olduğum problem, masa daha büyük olduğunda bir sayfa olmasıdır. Tablo 9 sıradan daha fazla olduğunda. Bir sonraki sayfada devam etmelidir.Çok sayfalı PDF'yi nesnel-c oluşturun

Kodda yaptığım şey budur.

+(void)drawPDF:(NSString*)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(); 
} 

Burada ne yaptığımı açıklamama izin verin. Masaüstümü doldurmam gereken bir dizi var. Dizi 8'den büyükse, 2 sayfa kullanmalıyım. Diğer her şey bir sayfa ile çalışır. Bu, sadece ikinci sayfayı yaratıyor olduğunu neyi

....

Biri bana yardım edebilir mi? Sadece UIGraphicsBeginPDFPageWithInfo() ikinci sayfayı oluştururken yine UIGraphicsBeginPDFContextToFile() çağırmamalıdır

cevap

15

, :

UIGraphicsBeginPDFContextToFile(...); 
UIGraphicsBeginPDFPageWithInfo(...); // start first page 
// ... 
UIGraphicsBeginPDFPageWithInfo(...); // start second page 
// ... 
UIGraphicsEndPDFContext(); 
+0

kullanın! Tesekkurler dostum ! – Steaphann

+0

Bazı değişiklikler ile bu bir çok sayfa pdf oluşturmak için mükemmel çalıştı. Teşekkürler dostum :) –

0

Sen ikinci sayfasında (UIGraphicsBeginPDFContextToFile(fileName, CGRectZero, nil)) için bağlam oluşturmak gerekmez, sadece bu sayfayı oluşturmak zorunda. CGPDFContextEndPage()'u kullanarak açılan sayfayı kapatmayı da unutmayın.

+0

İkinci bir sayfayı nasıl yaratıyorsunuz o zaman? – Steaphann

+0

@Tomasz: Hem UIGraphicsBeginPDFPageWithInfo() hem de UIGraphicsEndPDFContext() geçerli sayfayı kapatır. CGPDFContextEndPage(), anladığım kadarıyla, burada kullanılmayan CGPDFContextBeginPage() öğesinin karşılığıdır. –

+0

@MartinR - haklısın, yanlış makrolardım. –

1
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 
NSString *saveFileName = [NSString stringWithFormat:@"%@%fx%f.pdf", @"test", pageWidth, pageHeight]; 

NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); 

NSString* documentDirectory = [documentDirectories objectAtIndex:0]; 
NSString* savePath = [documentDirectory stringByAppendingPathComponent: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]; 
+0

Bu soruya iyi bir cevap olsa da, lütfen * neden * bu sorunu çözdüğü için bir açıklama gönderin. – Glorfindel

0
- (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 URLWithString:@"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 URLWithString:@"https://www.w3schools.com/css/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:(NSString*)text withFrame:(CGRect)frame fontSize:(float)fontSize { 



UIFont *font = [UIFont systemFontOfSize:fontSize]; 
CGSize stringSize = [text sizeWithFont:font constrainedToSize:CGSizeMake(pageSize.width - 2*20-2*20, pageSize.height - 2*20 - 2*20) lineBreakMode:UILineBreakModeWordWrap]; 



if((frame.origin.y + stringSize.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 < stringSize.width) 
    textWidth = stringSize.width; 
if (textWidth > pageSize.width) 
    textWidth = pageSize.width - frame.origin.x; 


CGRect renderingRect = CGRectMake(frame.origin.x, frame.origin.y, textWidth, stringSize.height); 

[text drawInRect:renderingRect withFont:font lineBreakMode:NSLineBreakByWordWrapping alignment:NSTextAlignmentLeft]; 

frame = CGRectMake(frame.origin.x, frame.origin.y, textWidth, stringSize.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; 


NSString *newPDFName = [NSString stringWithFormat:@"myPdf.pdf"]; 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

NSString *pdfPath = [documentsDirectory stringByAppendingPathComponent: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]; 
} 

pdf olarak yeni bir sayfa oluşturmak için, bu benim için çalıştı

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