2013-05-07 6 views
6

Я пытаюсь создать многостраничный PDF-файл. Я следил за этим tutorial. Это работает с XIB-файлом для статического текста, а затем добавляет таблицу из кода. Но проблема с банкоматом заключается в том, что когда таблица больше, чем одна страница. Когда таблица имеет более 9 строк. Он должен быть продолжен на следующей странице.Создание многостраничного PDF-файла в объекте-c

Это то, что я делаю в коде.

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

Позвольте мне объяснить, что я здесь делаю. У меня есть массив, который должен заполнить мой tableview. Если массив больше, чем 8, тогда я должен использовать 2 страницы. Иначе все работает с одной страницей.

Что это делает, он создает только вторую страницу ....

Может кто-нибудь мне помочь?

ответ

15

Вы не должны вызывать UIGraphicsBeginPDFContextToFile() снова при создании второй страницы, только UIGraphicsBeginPDFPageWithInfo():

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

Это работало для меня! Спасибо приятель ! – Steaphann

+0

С некоторыми изменениями эта одна совершенная работала для создания многостраничного PDF-файла. Спасибо dude :) –

0

Вам не нужно создавать контекст для второй страницы (UIGraphicsBeginPDFContextToFile(fileName, CGRectZero, nil)), вы должны только создать эту страницу. Вы также должны помнить о закрытии открытой страницы с помощью CGPDFContextEndPage().

+0

Как вы создаете вторую страницу? – Steaphann

+0

@Tomasz: И UIGraphicsBeginPDFPageWithInfo(), и UIGraphicsEndPDFContext() закрывают текущую страницу. CGPDFContextEndPage(), как я понимаю, является аналогом CGPDFContextBeginPage(), который здесь не используется. –

+0

@MartinR - ты прав, я ошибся в макросах. –

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

Хотя это может быть хорошим ответом на вопрос, пожалуйста, напишите какое-то объяснение относительно * почему * это решает проблему. – 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 используйте

UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, pageSize.width, pageSize.height), nil); 
Смежные вопросы