在CoreGraphics框架中,有兩個類型與PDF文檔的渲染有關,分別爲CGPDFDocumentRef與CGPDFPageRef。其中,CGPDFDocumentRef對應整個PDF文檔,裏面封裝了許多文檔相關的信息,CGPDFPageRef對應PDF文檔中某一頁的內容,經過它開發者能夠將PDF內容經過CGContext上下文渲染到指定目標上。數組
以下代碼演示了在自定義View的drawRect:方法中進行PDF文檔的繪製:框架
-(void)drawRect:(CGRect)rect{ //因爲座標系不一樣,須要進行翻轉 CGContextRef contextRef = UIGraphicsGetCurrentContext(); //進行座標系的翻轉 CGContextTranslateCTM(contextRef, 0, rect.size.height); CGContextScaleCTM(contextRef, 1.0, -1.0); //獲取pdf文件的路徑 NSString * path = [[NSBundle mainBundle] pathForResource:@"MyText" ofType:@"pdf"]; CFStringRef pathString = CFStringCreateWithCString(NULL, [path cStringUsingEncoding:NSUTF8StringEncoding], kCFStringEncodingUTF8); //建立url CFURLRef url = CFURLCreateWithFileSystemPath(NULL, pathString, kCFURLPOSIXPathStyle, 0); CFRelease(pathString); //進行CGPDFDocumentRef引用的建立 CGPDFDocumentRef document = CGPDFDocumentCreateWithURL(url); CFRelease(url); //獲取文檔的第1頁 CGPDFPageRef page1 = CGPDFDocumentGetPage(document, 1); //進行繪製 CGContextDrawPDFPage(contextRef, page1); CGPDFPageRelease(page1); CGPDFDocumentRelease(document); }
效果以下:ide
CGPDFDocument中提供的方法解析以下:加密
//經過數據提供者類來建立PDF文檔對象 CGPDFDocumentRef CGPDFDocumentCreateWithProvider(CGDataProviderRef cg_nullable provider); //經過url來建立PDF文檔 CGPDFDocumentRef CGPDFDocumentCreateWithURL(CFURLRef cg_nullable url); //進行引用計數+1 CGPDFDocumentRef CGPDFDocumentRetain(CGPDFDocumentRef cg_nullable document); //進行引用計數-1,須要注意,其做用和CFRelease()類似,不一樣的是若是document爲NULL,不是發生crash void CGPDFDocumentRelease(CGPDFDocumentRef cg_nullable document); //獲取PDF文檔的版本 void CGPDFDocumentGetVersion(CGPDFDocumentRef cg_nullable document, int * majorVersion, int * minorVersion); //判斷文檔是不是加密的 bool CGPDFDocumentIsEncrypted(CGPDFDocumentRef cg_nullable document); //使用密碼對PDF文檔進行解密 返回值爲1表示解密成功 bool CGPDFDocumentUnlockWithPassword(CGPDFDocumentRef cg_nullable document, const char * password); //判斷PDF文檔是否已經解鎖 bool CGPDFDocumentIsUnlocked(CGPDFDocumentRef cg_nullable document); //獲取此PDF文檔是否容許繪製 bool CGPDFDocumentAllowsPrinting(CGPDFDocumentRef cg_nullable document); //獲取此文檔是否容許拷貝 bool CGPDFDocumentAllowsCopying(CGPDFDocumentRef cg_nullable document); //獲取PDF文檔的總頁數 size_t CGPDFDocumentGetNumberOfPages(CGPDFDocumentRef cg_nullable document); //獲取文檔中某頁數據 CGPDFPageRef __nullable CGPDFDocumentGetPage(CGPDFDocumentRef cg_nullable document, size_t pageNumber); //獲取文檔的目錄信息 CGPDFDictionaryRef __nullable CGPDFDocumentGetCatalog(CGPDFDocumentRef cg_nullable document); //獲取文檔詳情信息 CGPDFDictionaryRef __nullable CGPDFDocumentGetInfo(CGPDFDocumentRef cg_nullable document); //獲取文檔id CGPDFArrayRef __nullable CGPDFDocumentGetID(CGPDFDocumentRef cg_nullable document); //獲取CGPDFDocument類在CoreGraphics框架中的id CFTypeID CGPDFDocumentGetTypeID(void);
CGPDFDocument中還有一些已經棄用的方法,這些方法如今封裝在CGPDFPage中,棄用的方法以下:url
CGRect CGPDFDocumentGetMediaBox(CGPDFDocumentRef cg_nullable document,int page); CGRect CGPDFDocumentGetCropBox(CGPDFDocumentRef cg_nullable document, int page); CGRect CGPDFDocumentGetBleedBox(CGPDFDocumentRef cg_nullable document, int page); CGRect CGPDFDocumentGetTrimBox(CGPDFDocumentRef cg_nullable document, int page); CGRect CGPDFDocumentGetArtBox(CGPDFDocumentRef cg_nullable document, int page); int CGPDFDocumentGetRotationAngle(CGPDFDocumentRef cg_nullable document, int page);
CGPDFPage中的主要方法列舉以下:spa
//進行引用計數+1 CGPDFPageRef CGPDFPageRetain(CGPDFPageRef cg_nullable page); //進行引用計數-1 void CGPDFPageRelease(CGPDFPageRef cg_nullable page); //獲取對應的PDF文檔對象 CGPDFDocumentRef __nullable CGPDFPageGetDocument(CGPDFPageRef cg_nullable page); //獲取當前頁是文檔中的第幾頁 size_t CGPDFPageGetPageNumber(CGPDFPageRef cg_nullable page); //獲取與文檔此頁相關聯的媒體區域 /* typedef CF_ENUM (int32_t, CGPDFBox) { kCGPDFMediaBox = 0, kCGPDFCropBox = 1, kCGPDFBleedBox = 2, kCGPDFTrimBox = 3, kCGPDFArtBox = 4 }; */ CGRect CGPDFPageGetBoxRect(CGPDFPageRef cg_nullable page, CGPDFBox box); //獲取此頁的旋轉角度 int CGPDFPageGetRotationAngle(CGPDFPageRef cg_nullable page); //transform變換 CGAffineTransform CGPDFPageGetDrawingTransform(CGPDFPageRef cg_nullable page, CGPDFBox box, CGRect rect, int rotate, bool preserveAspectRatio);
以下示例代碼演示了建立PDF文檔的過程:code
-(void)creatPDF{ //繪圖上下文 CGContextRef pdfContext; CFStringRef path; CFURLRef url; CFDataRef boxData = NULL; CFMutableDictionaryRef myDictionary = NULL; CFMutableDictionaryRef pageDictionary = NULL; //文件存放的路徑 NSString * filePath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true).firstObject; NSLog(@"%@",filePath); const char * filename = [[NSString stringWithFormat:@"%@/MyText",filePath] cStringUsingEncoding:kCFStringEncodingUTF8]; path = CFStringCreateWithCString (NULL, filename,kCFStringEncodingUTF8); url = CFURLCreateWithFileSystemPath (NULL, path,kCFURLPOSIXPathStyle, 0); CFRelease (path); //文檔信息字典 myDictionary = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); //設置文檔名稱 CFDictionarySetValue(myDictionary, kCGPDFContextTitle, CFSTR("My PDF File")); //設置建立者 CFDictionarySetValue(myDictionary, kCGPDFContextCreator, CFSTR("My Name")); //設置文檔尺寸 CGRect pageRect = CGRectMake(0, 0, 200, 200); //建立文檔 pdfContext = CGPDFContextCreateWithURL (url, &pageRect, myDictionary); CFRelease(myDictionary); CFRelease(url); //設置內容信息字典 pageDictionary = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); boxData = CFDataCreate(NULL,(const UInt8 *)&pageRect, sizeof (CGRect)); CFDictionarySetValue(pageDictionary, kCGPDFContextMediaBox, boxData); //開始渲染一頁 CGPDFContextBeginPage (pdfContext, pageDictionary); CGFloat colors[4] = {1,0,0,1}; CGContextSetFillColorSpace(pdfContext, CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB)); CGContextSetFillColor(pdfContext, colors); CGContextFillRect(pdfContext, CGRectMake(0, 0, 100, 100)); //結束此頁的渲染 CGPDFContextEndPage (pdfContext); //開始新一頁內容的渲染 CGPDFContextBeginPage (pdfContext, pageDictionary); CGContextSetFillColorSpace(pdfContext, CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB)); CGContextSetFillColor(pdfContext, colors); CGContextFillRect(pdfContext, CGRectMake(0, 0, 100, 100)); CGPDFContextEndPage (pdfContext); CGContextRelease (pdfContext); CFRelease(pageDictionary); CFRelease(boxData); }
上面代碼建立出的PDF文件以下圖所示:orm
在建立PDF文檔時,開發者還可使用以下列舉的方法來對文檔進行超連接添加,內容信息設置等:對象
//關閉文檔上下文,關閉後將不能再次寫入 void CGPDFContextClose(CGContextRef cg_nullable context); //開啓新一頁內容的繪製 void CGPDFContextBeginPage(CGContextRef cg_nullable context, CFDictionaryRef __nullable pageInfo); //結束當前頁內容的繪製 void CGPDFContextEndPage(CGContextRef cg_nullable context); //添加元數據 void CGPDFContextAddDocumentMetadata(CGContextRef cg_nullable context, CFDataRef __nullable metadata); //爲某個區域添加超連接 void CGPDFContextSetURLForRect(CGContextRef cg_nullable context, CFURLRef url, CGRect rect); //在文檔的某個點添加一個目標 void CGPDFContextAddDestinationAtPoint(CGContextRef cg_nullable context, CFStringRef name, CGPoint point); //爲某個區域添加跳轉目標功能 void CGPDFContextSetDestinationForRect(CGContextRef cg_nullable context, CFStringRef name, CGRect rect);
在設置文檔信息字典時,支持的經常使用鍵以下:開發
//設置文檔標題 可選設置 const CFStringRef kCGPDFContextTitle; //設置文檔的做者 可選設置 const CFStringRef kCGPDFContextAuthor; //設置文檔的副標題 可選設置 const CFStringRef kCGPDFContextSubject; //爲文檔設置關鍵字 可選設置 能夠設置爲一個數組 設置多個關鍵字 const CFStringRef kCGPDFContextKeywords; //設置文檔的建立者 const CFStringRef kCGPDFContextCreator; //爲文檔設置全部者密碼 const CFStringRef kCGPDFContextOwnerPassword; //爲文檔設置用戶密碼 const CFStringRef kCGPDFContextUserPassword; //設置加密密鑰長度 const CFStringRef kCGPDFContextEncryptionKeyLength; //設置是否容許繪製 const CFStringRef kCGPDFContextAllowsPrinting; //設置是否容許複製 const CFStringRef kCGPDFContextAllowsCopying;
專一技術,熱愛生活,交流技術,也作朋友。
——琿少 QQ羣:203317592