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

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

二、使用代码创建PDF文件


   如下示例代码演示了创建PDF文档的过程:


-(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文件如下图所示:


image.png

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


在创建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;

目录
相关文章
|
搜索推荐 数据管理 定位技术
iOS应用开发中有多种主流框架
iOS应用开发中有多种主流框架
918 60
|
移动开发 网络协议 小程序
基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v10.0版已发布
RainbowChat是一套基于开源IM即时通讯聊天框架 MobileIMSDK 的产品级移动端IM系统。RainbowChat源于真实运营的产品,解决了大量的屏幕适配、细节优化、机器兼容问题。RainbowChat可能是市面上提供im即时通讯聊天源码的,唯一一款同时支持TCP、UDP两种通信协议的IM产品。与姊妹产品RainbowTalk和RainbowChat-Web 技术同源,历经考验。
867 0
基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v10.0版已发布
|
人工智能 自然语言处理 安全
CodeBuddy 开发本地 PDF 转图工具
市场上的 PDF 转图片工具存在收费昂贵、功能有限、隐私安全风险等痛点,而使用 CodeBuddy 实现的本地 PDF 批量转图片工具可以有效解决这些问题。CodeBuddy 的强大编程能力让我们可以快速开发出满足需求的工具,而且工具可以在本地运行,保证了文件的隐私安全。此外,工具还支持批量处理和自定义功能,提高了工作效率。如果你也有 PDF 转图片的需求,不妨尝试使用 CodeBuddy 来实现一个属于自己的工具。
507 11
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
537 66
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。
316 1
|
移动开发 网络协议 小程序
基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v9.1版已发布
RainbowChat是一套基于开源IM聊天框架 MobileIMSDK 的产品级移动端IM系统。RainbowChat源于真实运营的产品,解决了大量的屏幕适配、细节优化、机器兼容问题
546 5
|
Swift iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】在苹果生态系统中,SwiftUI的引入无疑为iOS应用开发带来了革命性的变化。本文将通过深入浅出的方式,带领读者了解SwiftUI的基本概念、核心优势以及如何在实际项目中运用这一框架。我们将从一个简单的例子开始,逐步深入到更复杂的应用场景,让初学者能够快速上手,同时也为有经验的开发者提供一些深度使用的技巧和策略。
325 1
|
前端开发 iOS开发 开发者
探索iOS开发中的SwiftUI框架
【9月更文挑战第21天】在iOS应用开发的广阔天地中,SwiftUI框架如一股清新之风,为开发者带来了声明式语法的便捷与高效。本文将深入探讨SwiftUI的核心概念、布局方式及数据绑定机制,同时通过实例演示如何运用SwiftUI构建用户界面,旨在引领读者领略SwiftUI的魅力,并激发其对iOS开发新趋势的思考与实践。
235 6
|
iOS开发 开发者 UED
探索iOS应用开发中的SwiftUI框架
【9月更文挑战第26天】 在iOS开发的海洋中,SwiftUI犹如一艘现代的快艇,引领着开发者们驶向更加高效与直观的编程体验。本文将带你领略SwiftUI的魅力,从其设计理念到实际应用,我们将一步步揭开它如何简化界面构建过程的面纱。通过对比传统方式,你将看到SwiftUI如何让代码变得像诗一样优美,同时保持强大的功能性和灵活性。准备好让你的iOS开发技能加速升级,一起驾驭这股新潮流吧!
252 1
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。