iOS開發CoreGraphics核心圖形框架之九——PDF文件的渲染與建立

iOS開發CoreGraphics核心圖形框架之九——PDF文件的渲染與建立

1、渲染已有的PDF文檔

    在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);

2、使用代碼建立PDF文件

    以下示例代碼演示了建立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

相關文章
相關標籤/搜索