图片转PDF的实现方法
Quartz 2D概述
Quartz 2D是Core Grapgics下的2D绘图引擎,适用于iOS和Mac OS X。 它具有强大的绘图功能,提供视角效果渲染,反锯齿渲染,颜色管理,绘制PDF等等。
开发者无需考虑不同设备不同分别率的显示效果,因为这一切适配操作Quartz 全都自己包了。
具体Quartz可以做些什么,下图给出了最佳答案:
图片转PDF的工具类
利用Quartz 2D将图片数据转换成图片不失真的PDF,方法我已经封装好:
(PDF部分属性未列出,如果有额外需要,需要另行提出赋值)
//
// WQPDFManager.h
// wqphototopdf
//
// Created by Wu Qian on 12-10-22.
//
//
#import <Foundation/Foundation.h>
@interface WQPDFManager : NSObject
/**
* @brief 创建PDF文件
*
* @param imgData NSData型 照片数据
* @param destFileName NSString型 生成的PDF文件名
* @param pw NSString型 要设定的密码
*/
+ (void)WQCreatePDFFileWithSrc:(NSData *)imgData
toDestFile:(NSString *)destFileName
withPassword:(NSString *)pw;
/**
* @brief 抛出pdf文件存放地址
*
* @param filename NSString型 文件名
*
* @return NSString型 地址
*/
+ (NSString *)pdfDestPath:(NSString *)filename;
@end
//
// WQPDFManager.m
// wqphototopdf
//
// Created by Wu Qian on 12-10-22.
//
//
#import "WQPDFManager.h"
#import "WQPathUtilities.h"
@implementation WQPDFManager
void WQDrawContent(CGContextRef myContext,
CFDataRef data,
CGRect rect)
{
CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData(data);
CGImageRef image = CGImageCreateWithJPEGDataProvider(dataProvider,
NULL,
NO,
kCGRenderingIntentDefault);
CGContextDrawImage(myContext, rect, image);
CGDataProviderRelease(dataProvider);
CGImageRelease(image);
}
void MyCreatePDFFile (CFDataRef data,
CGRect pageRect,
const char *filepath,
CFStringRef password)
{
CGContextRef pdfContext;
CFStringRef path;
CFURLRef url;
CFDataRef boxData = NULL;
CFMutableDictionaryRef myDictionary = NULL;
CFMutableDictionaryRef pageDictionary = NULL;
path = CFStringCreateWithCString (NULL, filepath,
kCFStringEncodingUTF8);
url = CFURLCreateWithFileSystemPath (NULL, path,
kCFURLPOSIXPathStyle, 0);
CFRelease (path);
myDictionary = CFDictionaryCreateMutable(NULL,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(myDictionary,
kCGPDFContextTitle,
CFSTR("Photo from iPrivate Album"));
CFDictionarySetValue(myDictionary,
kCGPDFContextCreator,
CFSTR("iPrivate Album"));
if (password) {
CFDictionarySetValue(myDictionary, kCGPDFContextUserPassword, password);
CFDictionarySetValue(myDictionary, kCGPDFContextOwnerPassword, password);
}
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);
WQDrawContent(pdfContext,data,pageRect);
CGPDFContextEndPage (pdfContext);
CGContextRelease (pdfContext);
CFRelease(pageDictionary);
CFRelease(boxData);
}
+ (NSString *)pdfDestPath:(NSString *)filename
{
return [[WQPathUtilities tmpDirectory]stringByAppendingPathComponent:filename];
}
+ (void)WQCreatePDFFileWithSrc:(NSData *)imgData
toDestFile:(NSString *)destFileName
withPassword:(NSString *)pw
{
NSString *fileFullPath = [self pdfDestPath:destFileName];
const char *path = [fileFullPath UTF8String];
CFDataRef data = (__bridge CFDataRef)imgData;
UIImage *image = [UIImage imageWithData:imgData];
CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
CFStringRef password = (__bridge CFStringRef)pw;
MyCreatePDFFile(data,rect, path, password);
}
@end
调用方法
NSData *data = [NSData dataWithContentsOfFile:your_image_path];
NSString *pdfname = @"photoToPDF.pdf";
[WQPDFManager WQCreatePDFFileWithSrc:data toDestFile:pdfname withPassword:nil];
如果需要创建带密码保护的PDF,第三个参数传入密码即可。
效果图
以 【私人相册】 中的截图示意一下...
将照片转换为密码保护的PDF,并发送EMail ,接收者需键入密码才可查看照片:
P.S. : 下次分享下大数据高速读取、显示的处理吧~ ^_^
分享到:
相关推荐
iOS开发练习小程序——秒表参考.pdf
IOS应用源码——PDF生成类(将文本,html网页生成pdf的类).zip
IPHONE与IPAD开发实战——IOS经典应用剖析.pdf
今天的任务是:在iOS上加载显示...方法二:利用CGContextDrawPDFPage这样显示出来的pdf单页是倒立的,Quartz坐标系和UIView坐标系不一样所致,调整坐标系,使pdf正立:配合iOS5强大的UIPageViewController实现翻页浏览
快速掌握使用AV Foundation开发iOS和OS X应用的技术如果想开发富媒体iOS或OS X应用程序,你可以使用苹果公司推出的AV Foundation框架来实现诸多神奇功能。不过AV Foundation框架基于最前沿的语言特征,极其庞大,...
智能手机操作系统——以Android与iOS对比.pdf
《Delphi Web前端开发教程——基于TMS WEB Core框架》PDF本教程适合对使用Delphi TMS WEB Core 创建 Web 应用程序感兴趣的初学者和高级开发人员。学习本教程只需要免费的 Delphi 社区版以及 TMS WEB Core 的试用版就...
移动开发-《iOS编程入门指南》(第4版)翻译报告——以功能对等理论为指导.pdf
iPhone游戏开发入门经典——也适用于iPad
手机APP在中学地理教学中的应用——以iOS操作系统为例.pdf
让Android听得懂iOS设备的呼叫 ——一次跨系统设备互联互通的尝试.pdf
通过利用在本修订手册中列出的新的和校正过的实例,你将快速掌握编写完成ios应用所需的各个步骤——包括存储和保护数据、增强和动画化图形、管理文件和目录以及使用passbook。 本手册针对ios 6 sdk做了完整的更新...
公共图书馆移动应用现状研究——以iOS和Android平台为调研对象.pdf
二维游戏中背景的实现方法和技术;Box2D物理引擎;如何掌握声音引擎的用法;Cocos2D-X引擎的文件操作模块和内存管理机制;各种各样的粒子效果;如何掌握利用Lua脚本制作游戏的能力;Cocos2D-HTML5引擎版本;引擎的...
书籍描述: 超越Xcode应用程序开发的基础,实现共享按钮和活动视图控制器等工具,与其他用户和其他...使用文件应用程序实现iOS和MacOS文档提供了开发人员构建这些类型应用程序所需的技能组合——使用文件和构建文档。
这些都给与 Egret框架在开发中很多灵感。Egret借鉴了很多来自ActionScript的优点,站在巨人的肩膀上,踏上HTML5的技术浪潮,为HTML5 游戏领域贡献一份力量!Push game forward!是Egret游戏框架的口号。