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

来源:互联网 发布:阿里云elb 编辑:程序博客网 时间:2024/04/30 13:50

图片转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型 文件名 * *@returnNSString型 地址 */+ (NSString *)pdfDestPath:(NSString *)filename;@end

////  WQPDFManager.m//  wqphototopdf////  Created by Wu Qian on 12-10-22.////#import "WQPDFManager.h"#import "WQPathUtilities.h"@implementation WQPDFManagervoid 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. : 下次分享下大数据高速读取、显示的处理吧~  ^_^ 


原创粉丝点击