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

开发笔记 那些年追过的图片(九)图片转PDF的实现方法

2013-09-29 13:30 801 查看


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,第三个参数传入密码即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios image