ios 创建和绘画pdf文件 -转
转自:http://blog.csdn.net/ant1239/article/details/7761676
本方法为项目中画pdf的一个方法,画pdf,一共分为几步,1,获取地址,有两种获取地址方法,这是其中一种,2,关联上下文后开始绘画pdf,开始新的一页后必须用cgcontentbeginpage方法开始新的一页,从新设置坐标,等属性。3,释放。pdf就是个画布,我们是往上面画东西,而不是写东西,还有就是pdf用的坐标系是数学坐标,左下角为原点,而不是编程里常用的左上角为为坐标原点~一下是源码,重复的东西有点多,懒得整理了~关键的就那么几句~
-(void)MyPDFContextCreate{ //获取路径 NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);坐标 NSString *saveDirectory=[paths objectAtIndex:0]; NSString *saveFileName=@"myPDF.pdf"; NSString *newFilePath=[saveDirectory stringByAppendingPathComponent:saveFileName]; const char *filename=[newFilePath UTF8String]; //设置页面大小 CGRect pageRect=CGRectMake(0, 0, 612, 792); //关联上下文的对象 CGContextRef pdfContext; CFStringRef path; CFURLRef url; path=CFStringCreateWithCString(NULL, filename, kCFStringEncodingUTF8); url=CFURLCreateWithFileSystemPath(NULL, path, kCFURLPOSIXPathStyle, 0); CFRelease(path); pdfContext=CGPDFContextCreateWithURL(url, &pageRect, nil); CFRelease(url); //开始画pdf NSString *temtext=[[NSString alloc]init]; const char *text=(char *)[temtext UTF8String]; int width; int height; // 画推荐信 NSNumber *en=[self.fatherobject valueForKey:@"enabel"]; if(en.boolValue){ height=700; //开始画pdf,开始新的一页 CGContextBeginPage(pdfContext, &pageRect); //设置字体,字体大小等 CGContextSelectFont(pdfContext, "Helvetica", 30, kCGEncodingMacRoman); CGContextSetTextDrawingMode(pdfContext, kCGTextFill); CGContextSetRGBFillColor(pdfContext, 0, 0, 0, 1); //画姓名 if(self.firstname!=nil||self.lastname!=nil){ if(self.firstname==nil){ self.firstname=@""; } if(self.lastname==nil){ self.lastname=@""; } temtext=[NSString stringWithFormat:@"%@ %@",self.firstname,self.lastname]; } width=[self getfontwidth:temtext fontsize:30]; text=(char*)[temtext UTF8String]; CGContextSetFontSize(pdfContext, 30); //关键方法,在指定位置画上text文字,文字必须为char类型 CGContextShowTextAtPoint(pdfContext, (612-width)/2, height, text, strlen(text)); height=height-30; if((self.street!=nil&&![self.street isEqualToString:@""])|| (self.apt!=nil&&![self.apt isEqualToString:@""])|| (self.city!=nil&&![self.city isEqualToString:@""])|| (self.state!=nil&&![self.state isEqualToString:@""])|| (self.zip!=nil&&![self.zip isEqualToString:@""])){ if(self.street==nil){ self.street=@""; } if(self.apt==nil){ self.street=@""; } if(self.city==nil){ self.city=@""; } if(self.state==nil){ self.state=@""; } if(self.zip==nil){ self.zip=@""; } temtext=[NSString stringWithFormat:@"%@,%@,%@,%@,%@",self.street,self.apt,self.city,self.state,self.zip]; text=(char *)[temtext UTF8String]; width=[self getfontwidth:temtext fontsize:13]; CGContextSetFontSize(pdfContext, 13); CGContextShowTextAtPoint(pdfContext, (612-width)/2, height, text, strlen(text)); height=height-13; } if(self.phone==nil){ self.phone=@""; } if(self.fax==nil){ self.fax=@""; } if(self.Email==nil){ self.Email=@""; } if(self.website==nil){ self.website=@""; } if(![self.phone isEqualToString:@""]|| ![self.fax isEqualToString:@""]|| ![self.Email isEqualToString:@""]|| ![self.website isEqualToString:@""]){ temtext=[NSString stringWithFormat:@"Phone:%@, Fax:%@, Email:%@, Website:%@",self.phone,self.fax,self.Email,self.website]; text=(char *)[temtext UTF8String]; width=[self getfontwidth:temtext fontsize:13]; CGContextSetFontSize(pdfContext, 13); CGContextShowTextAtPoint(pdfContext, (612-width)/2, height, text, strlen(text)); height=height-13; } //划线 CGContextMoveToPoint(pdfContext, 50, height); CGContextAddLineToPoint(pdfContext, 612-50, height); CGContextStrokePath(pdfContext); height=height-20; //画cotterletter内容 NSManagedObject *myobject=[DataController getcontactinfo:self.fatherid]; NSString *myapt=[myobject valueForKey:@"apt"]; NSString *mycity=[myobject valueForKey:@"city"]; NSString *mycompanyname=[myobject valueForKey:@"companyname"]; NSString *myfirstname=[myobject valueForKey:@"firstname"]; NSString *mylastname=[myobject valueForKey:@"lastname"]; NSString *myposition=[myobject valueForKey:@"postion"]; NSString *mystate=[myobject valueForKey:@"state"]; NSString *mystreet=[myobject valueForKey:@"street"]; NSString *mytitle=[myobject valueForKey:@"title"]; NSString *myzip=[myobject valueForKey:@"zip"]; NSDate *mydate=[myobject valueForKey:@"date"]; if(mydate!=nil){ NSDateFormatter *myformatter=[[NSDateFormatter alloc]init]; [myformatter setDateFormat:@"MMMM, yyyy"]; temtext=[NSString stringWithFormat:@"%@",[myformatter stringFromDate:mydate]]; [myformatter release]; text=(char *)[temtext UTF8String]; CGContextSetFontSize(pdfContext, 13); CGContextShowTextAtPoint(pdfContext, 50, height, text, strlen(text)); height=height-30; } if((mytitle!=nil&&![mytitle isEqualToString:@""])|| (myfirstname!=nil&&![myfirstname isEqualToString:@""])|| (mylastname!=nil&&![mylastname isEqualToString:@""])){ temtext=[NSString stringWithFormat:@"%@ %@ %@",mytitle,myfirstname,mylastname]; height=[self plaintextatwith:50 width:450 text:temtext height:height fontsize:13 context:pdfContext]; height=height-14; } if(myposition!=nil&&![myposition isEqualToString:@""]){ temtext=[NSString stringWithFormat:@"%@",myposition]; height=[self plaintextatwith:50 width:450 text:temtext height:height fontsize:13 context:pdfContext]; height=height-14; } if(mycompanyname!=nil&&![mycompanyname isEqualToString:@""]){ temtext=[NSString stringWithFormat:@"%@",mycompanyname]; height=[self plaintextatwith:50 width:450 text:temtext height:height fontsize:13 context:pdfContext]; height=height-14; } if((![myapt isEqualToString:@""]&&myapt!=nil)|| (![mystreet isEqualToString:@""]&&mystreet!=nil)){ temtext=[NSString stringWithFormat:@"%@.,%@",myapt,mystreet]; height=[self plaintextatwith:50 width:450 text:temtext height:height fontsize:13 context:pdfContext]; height=height-14; } if((mycity!=nil&&![mycity isEqualToString:@""])|| (mystate!=nil&&![mystate isEqualToString:@""])|| (myzip!=nil&&![myzip isEqualToString:@""])){ temtext=[NSString stringWithFormat:@"%@,%@,%@",mycity,mystate,myzip]; height=[self plaintextatwith:50 width:450 text:temtext height:height fontsize:13 context:pdfContext]; height=height-14; } if((mytitle!=nil&&![mytitle isEqualToString:@""])|| (mylastname!=nil&&![mylastname isEqualToString:@""])){ height=height-15; temtext=[NSString stringWithFormat:@"Dear %@.%@",mytitle,mylastname]; height=[self plaintextatwith:50 width:450 text:temtext height:height fontsize:13 context:pdfContext]; height=height-40; } if(self.coverletter!=nil&&![self.coverletter isEqualToString:@""]){ temtext=[NSString stringWithFormat:@"%@",self.coverletter]; height=[self plaintextatwith:50 width:450 text:temtext height:height fontsize:13 context:pdfContext]; } //结束 CGContextEndPage(pdfContext); } if(YES){ //开始画resume内容 CGContextBeginPage(pdfContext, &pageRect); CGContextSelectFont(pdfContext, "Helvetica", 30, kCGEncodingMacRoman); CGContextSetTextDrawingMode(pdfContext, kCGTextFill); CGContextSetRGBFillColor(pdfContext, 0, 0, 0, 1); //显示first和lastname if(self.firstname!=nil||self.lastname!=nil){ if(self.firstname==nil) self.firstname=@""; if(self.lastname==nil) self.lastname=@""; temtext=[NSString stringWithFormat:@"%@ %@",self.firstname,self.lastname]; width=[self getfontwidth:temtext fontsize:30]; height=700; text=(char*)[temtext UTF8String]; CGContextShowTextAtPoint(pdfContext, (612-width)/2, height, text, strlen(text)); } //显示street等basicinfo信息 //street,apt if((self.street!=nil &&![self.street isEqualToString:@""])||(self.apt!=nil&&![self.apt isEqualToString:@""])){ if(self.street==nil){ self.street=@""; } if(self.apt==nil){ self.apt=@""; } height=[self getfontheight:temtext fontsize:10 height:height]; CGContextSelectFont(pdfContext, "Helvetica", 10, kCGEncodingMacRoman); temtext=[NSString stringWithFormat:@"%@,%@",self.street,self.apt]; width=[self getfontwidth:temtext fontsize:10]; text=(char *)[temtext UTF8String]; CGContextShowTextAtPoint(pdfContext, (612-width)/2, height, text,strlen(text)); } //city,state zip if((self.city!=nil&&![self.city isEqualToString:@""])|| (self.state!=nil&&![self.state isEqualToString:@""])|| (self.zip!=nil&&![self.state isEqualToString:@""])){ if(self.city==nil){ self.city=@""; } if(self.state==nil){ self.state=@""; } if(self.zip==nil){ self.zip=@""; } height=[self getfontheight:temtext fontsize:10 height:height]; CGContextSelectFont(pdfContext, "Helvetica", 10,kCGEncodingMacRoman ); temtext=[NSString stringWithFormat:@"%@,%@,%@",self.city,self.state,self.zip]; width=[self getfontwidth:temtext fontsize:10]; text=(char *)[temtext UTF8String]; CGContextShowTextAtPoint(pdfContext, (612-width)/2, height, text, strlen(text)); } //phone if(self.phone!=nil&&![self.phone isEqualToString:@""]){ height=[self getfontheight:temtext fontsize:10 height:height]; CGContextSelectFont(pdfContext, "Helvetica", 10,kCGEncodingMacRoman ); temtext=[NSString stringWithFormat:@"Phone: %@",self.phone]; width=[self getfontwidth:temtext fontsize:10]; text=(char *)[temtext UTF8String]; CGContextShowTextAtPoint(pdfContext, (612-width)/2, height, text, strlen(text)); } //fax if(self.fax!=nil&&![self.fax isEqualToString:@""]){ height=[self getfontheight:temtext fontsize:10 height:height]; CGContextSelectFont(pdfContext, "Helvetica", 10,kCGEncodingMacRoman ); temtext=[NSString stringWithFormat:@"Fax: %@",self.fax]; width=[self getfontwidth:temtext fontsize:10]; text=(char *)[temtext UTF8String]; CGContextShowTextAtPoint(pdfContext, (612-width)/2, height, text, strlen(text)); } //Email if(self.Email!=nil&&![self.Email isEqualToString:@""]){ height=[self getfontheight:temtext fontsize:10 height:height]; temtext=[NSString stringWithFormat:@"Email: %@",self.Email]; width=[self getfontwidth:temtext fontsize:10]; text=(char *)[temtext UTF8String]; CGContextShowTextAtPoint(pdfContext, (612-width)/2, height, text, strlen(text)); } //website if(self.website!=nil&&![self.website isEqualToString:@""]){ height=[self getfontheight:temtext fontsize:10 height:height]; temtext=[NSString stringWithFormat:@"Website: %@",self.website]; width=[self getfontwidth:temtext fontsize:10]; text=(char *)[temtext UTF8String]; CGContextShowTextAtPoint(pdfContext, (612-width)/2, height, text, strlen(text)); } //Objective if(self.objective!=nil&&![self.objective isEqualToString:@""]){ //画线 height=[self getfontheight:temtext fontsize:10 height:height]; CGContextMoveToPoint(pdfContext, 50, height); CGContextAddLineToPoint(pdfContext, 612-50, height); CGContextStrokePath(pdfContext); height=height-20; text=(char *)[@"Objective" UTF8String]; CGContextSetFontSize(pdfContext, 15); CGContextShowTextAtPoint(pdfContext, 55, height, text, strlen(text)); // CGContextSetFontSize(pdfContext, 10); height=height+13; temtext=[NSString stringWithFormat:@"%@",self.objective]; height=[self plaintextatwith:150 width:350 text:temtext height:height fontsize:13 context:pdfContext]; } //5个可以排序的 for (int i=0;i<5;i++){ if([OrderData getskillnumber]==i){ //skill if(self.skills!=nil&&[self.skills count]!=0){ // skill划线 height=[self getfontheight:temtext fontsize:15 height:height]; CGContextMoveToPoint(pdfContext, 50, height); CGContextAddLineToPoint(pdfContext, 612-50, height); CGContextStrokePath(pdfContext); height=height-20; text=(char *)[@"Skills" UTF8String]; CGContextSetFontSize(pdfContext, 15); CGContextShowTextAtPoint(pdfContext, 55, height, text, strlen(text)); //skill内容 //height=height+13; for(int i=0;i<[self.skills count];i++){ NSManagedObject *object=[self.skills objectAtIndex:i]; temtext=[NSString stringWithFormat:@"* %@",[object valueForKey:@"skill"]]; height=[self plaintextatwith:150 width:350 text:temtext height:height fontsize:13 context:pdfContext]; // height=height-13; } } }else if([OrderData getothernumber]==i){ //other if(self.others!=nil&&[self.others count]!=0){ // other划线 height=[self getfontheight:temtext fontsize:15 height:height]; CGContextMoveToPoint(pdfContext, 50, height); CGContextAddLineToPoint(pdfContext, 612-50, height); CGContextStrokePath(pdfContext); height=height-20; text=(char *)[@"Others" UTF8String]; CGContextSetFontSize(pdfContext, 15); CGContextShowTextAtPoint(pdfContext, 55, height, text, strlen(text)); //other内容 for(int i=0;i<[self.others count];i++){ NSManagedObject *object=[self.others objectAtIndex:i]; temtext=[NSString stringWithFormat:@"* %@",[object valueForKey:@"other"]]; height=[self plaintextatwith:150 width:350 text:temtext height:height fontsize:13 context:pdfContext]; // height=height-13; } } }else if([OrderData getexperiencenumber]==i){ //experience if(self.experience!=nil&&[self.experience count]!=0){ //排序 NSSortDescriptor *descriptor=[NSSortDescriptor sortDescriptorWithKey:@"start" ascending:NO]; [self.experience setArray:[self.experience sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor, nil]]]; // other划线 height=[self getfontheight:temtext fontsize:15 height:height]; CGContextMoveToPoint(pdfContext, 50, height); CGContextAddLineToPoint(pdfContext, 612-50, height); CGContextStrokePath(pdfContext); height=height-20; text=(char *)[@"Experience" UTF8String]; CGContextSetFontSize(pdfContext, 15); CGContextShowTextAtPoint(pdfContext, 55, height, text, strlen(text)); //experience内容 for(int i=0;i<[self.experience count];i++){ NSManagedObject *object=[self.experience objectAtIndex:i]; NSString *position=[object valueForKey:@"position"]; NSString *companyname=[object valueForKey:@"companyname"]; NSString *location=[object valueForKey:@"location"]; NSDate *startdate=[object valueForKey:@"start"]; NSDate *enddate=[object valueForKey:@"end"]; NSString *thisid=[object valueForKey:@"thisid"]; temtext=[NSString stringWithFormat:@"%@",position]; height=[self plaintextatwith:150 width:350 text:temtext height:height fontsize:15 context:pdfContext]; height=height-13; temtext=[NSString stringWithFormat:@"%@, %@",companyname,location]; height=[self plaintextatwith:180 width:320 text:temtext height:height fontsize:13 context:pdfContext]; height=height-13; NSDateFormatter *timeformatter=[[NSDateFormatter alloc]init]; [timeformatter setDateFormat:@"MMMM, yyyy"]; NSNumber *number=(NSNumber*)[object valueForKey:@"currentjob"]; if(!number.boolValue){ temtext=[NSString stringWithFormat:@"%@ ~ %@",[timeformatter stringFromDate:startdate],[timeformatter stringFromDate:enddate]]; }else{ temtext=[NSString stringWithFormat:@"%@ ~ Present",[timeformatter stringFromDate:startdate]]; } [timeformatter release]; height=[self plaintextatwith:180 width:320 text:temtext height:height fontsize:13 context:pdfContext]; NSMutableArray *responsibility=[DataController getresponsibility:thisid]; NSLog(@"responsibility cout:%d \n responsibility context:%@",[responsibility count],responsibility); for(int j=0;j<[responsibility count];j++){ NSManagedObject *object=[responsibility objectAtIndex:j]; NSString *respon=[object valueForKey:@"responsibility"]; temtext=[NSString stringWithFormat:@"* %@",respon]; height=[self plaintextatwith:150 width:350 text:temtext height:height fontsize:13 context:pdfContext]; height=height-13; NSLog(@"J=%d",j); } height=height-15; } } }else if([OrderData geteducationnumber]==i){ //Education if(self.education!=nil&&[self.education count]!=0){ //排序 NSSortDescriptor *descriptor=[NSSortDescriptor sortDescriptorWithKey:@"starttime" ascending:NO]; [self.education setArray:[self.education sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor, nil]]]; // other划线 height=[self getfontheight:temtext fontsize:15 height:height]; CGContextMoveToPoint(pdfContext, 50, height); CGContextAddLineToPoint(pdfContext, 612-50, height); CGContextStrokePath(pdfContext); height=height-20; text=(char *)[@"Education" UTF8String]; CGContextSetFontSize(pdfContext, 15); CGContextShowTextAtPoint(pdfContext, 55, height, text, strlen(text)); //内容 for(int i=0;i<[self.education count];i++){ NSManagedObject *object=[self.education objectAtIndex:i]; NSString *schoolname=[object valueForKey:@"school"]; NSDate *startdate=[object valueForKey:@"starttime"]; NSDate *enddate=[object valueForKey:@"endtime"]; NSString *comment=[object valueForKey:@"comment"]; NSString *major=[object valueForKey:@"major"]; //height=height-13; temtext=[NSString stringWithFormat:@"%@",schoolname]; height=[self plaintextatwith:150 width:350 text:temtext height:height fontsize:15 context:pdfContext]; height=height-13; NSDateFormatter *timeformatter=[[NSDateFormatter alloc]init]; [timeformatter setDateFormat:@"MMMM, yyyy"]; temtext=[NSString stringWithFormat:@"%@ ~ %@",[timeformatter stringFromDate:startdate],[timeformatter stringFromDate:enddate]]; [timeformatter release]; height=[self plaintextatwith:180 width:320 text:temtext height:height fontsize:13 context:pdfContext]; height=height-13; temtext=[NSString stringWithFormat:@"%@",major]; height=[self plaintextatwith:180 width:320 text:temtext height:height fontsize:13 context:pdfContext]; height=height-13; temtext=[NSString stringWithFormat:@"%@",comment]; height=[self plaintextatwith:180 width:320 text:temtext height:height fontsize:13 context:pdfContext]; } } }else if([OrderData getawardnumber]==i){ //award if(self.awards!=nil&&[self.awards count]!=0){ //排序 NSSortDescriptor *descriptor=[NSSortDescriptor sortDescriptorWithKey:@"awarddate" ascending:NO]; [self.awards setArray:[self.awards sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor, nil]]]; // other划线 height=[self getfontheight:temtext fontsize:15 height:height]; CGContextMoveToPoint(pdfContext, 50, height); CGContextAddLineToPoint(pdfContext, 612-50, height); CGContextStrokePath(pdfContext); height=height-20; text=(char *)[@"Awards" UTF8String]; CGContextSetFontSize(pdfContext, 15); CGContextShowTextAtPoint(pdfContext, 55, height, text, strlen(text)); //award内容 for(int i=0;i<[self.awards count];i++){ NSManagedObject *object=[self.awards objectAtIndex:i]; NSString *comment=[object valueForKey:@"comment"]; NSString *name=[object valueForKey:@"name"]; NSDate *awarddate=[object valueForKey:@"awarddate"]; temtext=[NSString stringWithFormat:@"%@",name]; height= [self plaintextatwith:150 width:350 text:temtext height:height fontsize:15 context:pdfContext]; height=height-13; NSDateFormatter *timeformatter=[[NSDateFormatter alloc]init]; [timeformatter setDateFormat:@"MMMM, dd, yyyy"]; temtext=[NSString stringWithFormat:@"%@",[timeformatter stringFromDate:awarddate]]; [timeformatter release]; height=[self plaintextatwith:180 width:320 text:temtext height:height fontsize:15 context:pdfContext]; height=height-13; temtext=[NSString stringWithFormat:@"%@",comment]; height=[self plaintextatwith:180 width:320 text:temtext height:height fontsize:13 context:pdfContext]; height=height-15; } } } } CGContextEndPage(pdfContext); } CGContextRelease(pdfContext); }