ios开发之--PDF文件生成
生活随笔
收集整理的這篇文章主要介紹了
ios开发之--PDF文件生成
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
寫項目的時候,碰到一個需求,就是在手機端根據指定的文件內容生成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
總結
以上是生活随笔為你收集整理的ios开发之--PDF文件生成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CRC8算法实现
- 下一篇: 网页上预览pdf文件的几种方案