iOS开发CoreGraphics核心图形框架之九——PDF文件的渲染与创建(一)

简介: iOS开发CoreGraphics核心图形框架之九——PDF文件的渲染与创建

一、渲染已有的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);

}

效果如下:

image.png



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


目录
相关文章
|
8天前
|
Web App开发 Windows
【Windows】 chrome 如何下载网站在线预览PDF文件,保存到本地
【Windows】 chrome 如何下载网站在线预览PDF文件,保存到本地
193 0
|
8天前
|
算法 计算机视觉 iOS开发
iOS 实时图像处理技术:Core Image 框架的应用
【4月更文挑战第8天】 在移动设备上实现高效的图像处理功能,对于提升用户体验和扩展应用程序能力至关重要。苹果公司的iOS平台提供了强大的Core Image框架,它允许开发者以高效和直观的方式执行复杂的图像处理任务。本文将深入探讨Core Image框架的关键特性,并通过实例演示如何在iOS应用中集成实时图像处理功能,不仅提高性能,同时保持了电池寿命的优化。我们将重点讨论面部识别、滤镜应用和性能优化等关键技术点,为读者提供一份全面的iOS图像处理指南。
|
8天前
|
JSON 关系型数据库 数据库
【python】Python将100个PDF文件对应的json文件存储到MySql数据库(源码)【独一无二】
【python】Python将100个PDF文件对应的json文件存储到MySql数据库(源码)【独一无二】
【python】Python将100个PDF文件对应的json文件存储到MySql数据库(源码)【独一无二】
|
3天前
|
数据采集 数据安全/隐私保护 Python
2024年最新【Python】如何用Python来操作PDF文件,收藏(2),2024年最新阿里p7Python面试题
2024年最新【Python】如何用Python来操作PDF文件,收藏(2),2024年最新阿里p7Python面试题
2024年最新【Python】如何用Python来操作PDF文件,收藏(2),2024年最新阿里p7Python面试题
|
8天前
|
弹性计算 运维 Shell
|
8天前
|
JSON 监控 JavaScript
【LLM】基于LLama构建智能助理实现与PDF文件智能对话
【4月更文挑战第12天】构建智能助理服务,实现与PDF的自由对话
45 0
|
8天前
|
Python
python html(文件/url/html字符串)转pdf
python html(文件/url/html字符串)转pdf
11 0
|
8天前
|
Python
Python 合并多个 PDF 文件并建立书签目录
Python 合并多个 PDF 文件并建立书签目录
20 1
|
8天前
|
前端开发
开发过程中遇到过的docx、pptx、xlsx、pdf文件预览多种方式
开发过程中遇到过的docx、pptx、xlsx、pdf文件预览多种方式
27 0
|
8天前
|
数据挖掘 数据安全/隐私保护 开发者
使用Spire.PDF for Python插件从PDF文件提取文字和图片信息
使用Spire.PDF for Python插件从PDF文件提取文字和图片信息
150 0