您的位置:首页 > 移动开发 > IOS开发

iOS开发——图片转PDF的实现方法

2012-11-26 09:35 731 查看
图片转PDF的实现方法


Quartz 2D概述

Quartz 2D是Core Grapgics下的2D绘图引擎,适用于iOS和Mac OS X。 它具有强大的绘图功能,提供视角效果渲染,反锯齿渲染,颜色管理,绘制PDF等等。

开发者无需考虑不同设备不同分别率的显示效果,因为这一切适配操作Quartz 全都自己包了。

具体Quartz可以做些什么,下图给出了最佳答案:




图片转PDF的工具类

利用Quartz 2D将图片数据转换成图片不失真的PDF,方法我已经封装好:

(PDF部分属性未列出,如果有额外需要,需要另行提出赋值)

[cpp] view
plaincopyprint?

//

// 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

[cpp] view
plaincopyprint?

//

// 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


调用方法

[cpp] view
plaincopyprint?

NSData *data = [NSData dataWithContentsOfFile:your_image_path];

NSString *pdfname = @"photoToPDF.pdf";

[WQPDFManager WQCreatePDFFileWithSrc:data toDestFile:pdfname withPassword:nil];

如果需要创建带密码保护的PDF,第三个参数传入密码即可。


效果图

以 【私人相册】 中的截图示意一下...

将照片转换为密码保护的PDF,并发送EMail ,接收者需键入密码才可查看照片:





P.S. : 下次分享下大数据高速读取、显示的处理吧~ ^_^
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: