一、渲染已有的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);
}
效果如下:
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中,弃用的方法如下:
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中的主要方法列举如下:
//进行引用计数+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);