寫項目的時候,碰到一個需求,就是在手機端根據指定的文件內容生成PDF文件,並可以保存到手機上,因為以前只是聽說過,沒有真正的去了解過這個需求,通過查閱資料,可以實現這個功能,話不多說,代碼如下:
-(void)creatPDFfile { // 1.創建media box CGFloat myPageWidth = self.view.bounds.size.width; CGFloat myPageHeight = self.view.bounds.size.height; CGRect mediaBox = CGRectMake (0, 0, myPageWidth, myPageHeight); // 2.設置pdf文檔存儲的路徑 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = paths[0]; NSString *filePath = [documentsDirectory stringByAppendingString:@"/test.pdf"]; // NSLog(@"%@", filePath); const char *cfilePath = [filePath UTF8String]; CFStringRef pathRef = CFStringCreateWithCString(NULL, cfilePath, kCFStringEncodingUTF8); // 3.設置當前pdf頁面的屬性 CFStringRef myKeys[3]; CFTypeRef myValues[3]; myKeys[0] = kCGPDFContextMediaBox; myValues[0] = (CFTypeRef) CFDataCreate(NULL,(const UInt8 *)&mediaBox, sizeof (CGRect)); myKeys[1] = kCGPDFContextTitle; myValues[1] = CFSTR("我的PDF"); myKeys[2] = kCGPDFContextCreator; myValues[2] = CFSTR("Jymn_Chen"); CFDictionaryRef pageDictionary = CFDictionaryCreate(NULL, (const void **) myKeys, (const void **) myValues, 3,&kCFTypeDictionaryKeyCallBacks, & kCFTypeDictionaryValueCallBacks); // 4.獲取pdf繪圖上下文 CGContextRef myPDFContext = MyPDFContextCreate (&mediaBox, pathRef); // 5.開始描繪第一頁頁面 CGPDFContextBeginPage(myPDFContext, pageDictionary); CGContextSetRGBFillColor (myPDFContext, 1, 0, 0, 1); CGContextFillRect (myPDFContext, CGRectMake (0, 0, 200, 100 )); CGContextSetRGBFillColor (myPDFContext, 0, 0, 1, .5); CGContextFillRect (myPDFContext, CGRectMake (0, 0, 100, 200 )); // 為一個矩形設置URL鏈接www.baidu.com CFURLRef baiduURL = CFURLCreateWithString(NULL, CFSTR("http://www.baidu.com"), NULL); CGContextSetRGBFillColor (myPDFContext, 0, 0, 0, 1); CGContextFillRect (myPDFContext, CGRectMake (200, 200, 100, 200 )); CGPDFContextSetURLForRect(myPDFContext, baiduURL, CGRectMake (200, 200, 100, 200 )); // 為一個矩形設置一個跳轉終點 CGPDFContextAddDestinationAtPoint(myPDFContext, CFSTR("page"), CGPointMake(120.0, 400.0)); CGPDFContextSetDestinationForRect(myPDFContext, CFSTR("page"), CGRectMake(50.0, 300.0, 100.0, 100.0)); // 跳轉點的name為page // CGPDFContextSetDestinationForRect(myPDFContext, CFSTR("page2"), CGRectMake(50.0, 300.0, 100.0, 100.0)); // 跳轉點的name為page2 CGContextSetRGBFillColor(myPDFContext, 1, 0, 1, 0.5); CGContextFillEllipseInRect(myPDFContext, CGRectMake(50.0, 300.0, 100.0, 100.0)); CGPDFContextEndPage(myPDFContext); // 6.開始描繪第二頁頁面 // 注意要另外創建一個page dictionary CFDictionaryRef page2Dictionary = CFDictionaryCreate(NULL, (const void **) myKeys, (const void **) myValues, 3,&kCFTypeDictionaryKeyCallBacks, & kCFTypeDictionaryValueCallBacks); CGPDFContextBeginPage(myPDFContext, page2Dictionary); // 在左下角畫兩個矩形 CGContextSetRGBFillColor (myPDFContext, 1, 0, 0, 1); CGContextFillRect (myPDFContext, CGRectMake (0, 0, 200, 100 )); CGContextSetRGBFillColor (myPDFContext, 0, 0, 1, .5); CGContextFillRect (myPDFContext, CGRectMake (0, 0, 100, 200 )); // 在右下角寫一段文字:"Page 2" CGContextSelectFont(myPDFContext, "Helvetica", 30, kCGEncodingMacRoman); CGContextSetTextDrawingMode (myPDFContext, kCGTextFill); CGContextSetRGBFillColor (myPDFContext, 0, 0, 0, 1); const char *text = [@"Page 2" UTF8String]; CGContextShowTextAtPoint (myPDFContext, 120, 80, text, strlen(text)); // CGPDFContextAddDestinationAtPoint(myPDFContext, CFSTR("page2"), CGPointMake(120.0, 120.0)); // 跳轉點的name為page2 // CGPDFContextAddDestinationAtPoint(myPDFContext, CFSTR("page"), CGPointMake(120.0, 120.0)); // 跳轉點的name為page // 為右上角的矩形設置一段file URL鏈接,打開本地文件 NSURL *furl = [NSURL fileURLWithPath:@"/Users/one/Library/Application Support/iPhone Simulator/7.0/Applications/3E7CB341-693A-4FE4-8FE5-A827A5210F0A/Documents/test1.pdf"]; CFURLRef fileURL = (__bridge CFURLRef)furl; CGContextSetRGBFillColor (myPDFContext, 0, 0, 0, 1); CGContextFillRect (myPDFContext, CGRectMake (200, 200, 100, 200 )); CGPDFContextSetURLForRect(myPDFContext, fileURL, CGRectMake (200, 200, 100, 200 )); CGPDFContextEndPage(myPDFContext); // 7.創建第三頁內容 CFDictionaryRef page3Dictionary = CFDictionaryCreate(NULL, (const void **) myKeys, (const void **) myValues, 3,&kCFTypeDictionaryKeyCallBacks, & kCFTypeDictionaryValueCallBacks); CGPDFContextBeginPage(myPDFContext, page3Dictionary); CGContextSetRGBFillColor (myPDFContext, 0, 0, 0, 1); CGPDFContextEndPage(myPDFContext); // 8.釋放創建的對象 CFRelease(page3Dictionary); CFRelease(page2Dictionary); CFRelease(pageDictionary); CFRelease(myValues[0]); CGContextRelease(myPDFContext); }
獲得圖形上下文:
/* * 獲取pdf繪圖上下文 * inMediaBox指定pdf頁面大小 * path指定pdf文件保存的路徑 */ CGContextRef MyPDFContextCreate (const CGRect *inMediaBox, CFStringRef path) { CGContextRef myOutContext = NULL; CFURLRef url; CGDataConsumerRef dataConsumer; url = CFURLCreateWithFileSystemPath (NULL, path, kCFURLPOSIXPathStyle, false); if (url != NULL) { dataConsumer = CGDataConsumerCreateWithURL(url); if (dataConsumer != NULL) { myOutContext = CGPDFContextCreate (dataConsumer, inMediaBox, NULL); CGDataConsumerRelease (dataConsumer); } CFRelease(url); } return myOutContext; }
沙盒內容如下:
至此,一個PDF生成就結束了,目前打開的話,我這邊寫的是使用UIActivity進行打開操作,目前還沒有找到存到到本機的方法,只是從沙盒里面取出來打開!
參考:http://blog.csdn.net/jymn_chen/article/details/14209855