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


目录
相关文章
|
iOS开发 开发者
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
947 67
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
|
人工智能 自然语言处理 安全
CodeBuddy 开发本地 PDF 转图工具
市场上的 PDF 转图片工具存在收费昂贵、功能有限、隐私安全风险等痛点,而使用 CodeBuddy 实现的本地 PDF 批量转图片工具可以有效解决这些问题。CodeBuddy 的强大编程能力让我们可以快速开发出满足需求的工具,而且工具可以在本地运行,保证了文件的隐私安全。此外,工具还支持批量处理和自定义功能,提高了工作效率。如果你也有 PDF 转图片的需求,不妨尝试使用 CodeBuddy 来实现一个属于自己的工具。
457 11
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
498 66
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
602 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
1839 11
|
人工智能 程序员 API
iOS|记一名 iOS 开发新手的前两次 App 审核经历
啥,这玩意也有新手保护期?
472 0
|
存储 JSON API
如何将 Swagger 文档导出为 PDF 文件
你会发现自己可能需要将 Swagger 文档导出为 PDF 或文件,以便于共享和存档。在这篇博文中,我们将指导你完成将 Swagger 文档导出为 PDF 格式的过程。
|
10月前
|
C#
【PDF提取内容改名】批量提取PDF指定区域内容重命名PDF文件,PDF自动提取内容命名的方案和详细步骤
本工具可批量提取PDF中的合同编号、日期、发票号等关键信息,支持PDF自定义区域提取并自动重命名文件,适用于合同管理、发票处理、文档归档和数据录入场景。基于iTextSharp库实现,提供完整代码示例与百度、腾讯网盘下载链接,助力高效处理PDF文档。
1320 40
|
10月前
|
编译器 Python
如何利用Python批量重命名PDF文件
本文介绍了如何使用Python提取PDF内容并用于文件重命名。通过安装Python环境、PyCharm编译器及Jupyter Notebook,结合tabula库实现PDF数据读取与处理,并提供代码示例与参考文献。
|
人工智能 算法 安全
使用CodeBuddy实现批量转换PPT、Excel、Word为PDF文件工具
通过 CodeBuddy 实现本地批量转换工具,让复杂的文档处理需求转化为 “需求描述→代码生成→一键运行” 的极简流程,真正实现 “技术为效率服务” 的目标。感兴趣的快来体验下把
824 10

热门文章

最新文章