iOS開發——圖片轉PDF的實現方法

圖片轉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. : 下次分享下大數據高速讀取、顯示的處理吧~  ^_^ 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章