图片转PDF的实现方法
Quartz 2D概述
Quartz2D是CoreGrapgics下的2D绘图引擎,适用于iOS和MacOS X。 它具有强大的绘图功能,提供视角效果渲染,反锯齿渲染,颜色管理,绘制PDF等等。
开发者无需考虑不同设备不同分别率的显示效果,因为这一切适配操作Quartz全都自己包了。
具体Quartz可以做些什么,下图给出了最佳答案:
图片转PDF的工具类
利用Quartz2D将图片数据转换成图片不失真的PDF,方法我已经封装好:
(PDF部分属性未列出,如果有额外需要,需要另行提出赋值)
[cpp]
- //
- //
WQPDFManager.h - //
wqphototopdf - //
- //
Created by Wu Qian on 12-10-22. - //
- //
-
- #import
-
- @interface
WQPDFManager : NSObject -
-
- +
(void)WQCreatePDFFileWithSrc:(NSData *)imgData -
toDestFile:(NSString *)destFileName -
withPassword:(NSString *)pw; -
-
-
- +
(NSString *)pdfDestPath:(NSString *)filename; -
- @end
[cpp]
- //
- //
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 = CGDataProviderCreateWith CFData(data); -
CGImageRef image = CGImageCreateWithJPEGDat aProvider(dataProvider, -
NULL, -
NO, -
kCGRenderingIntentDefaul t); -
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 = CFStringCreateWithCStrin g (NULL, filepath, -
kCFStringEncodingUTF8); -
url = CFURLCreateWithFileSyste mPath (NULL, path, -
kCFURLPOSIXPathStyle, 0); -
CFRelease (path); -
myDictionary = CFDictionaryCreateMutabl e(NULL, -
0, -
&kCFTypeDictionaryKeyCall Backs, -
&kCFTypeDictionaryValueCa llBacks); -
CFDictionarySetValue(myDictionary, -
kCGPDFContextTitle, -
CFSTR("Photo from iPrivate Album")); -
CFDictionarySetValue(myDictionary, -
kCGPDFContextCreator, -
CFSTR("iPrivate Album")); -
if (password) { -
CFDictionarySetValue(myDictionary, kCGPDFContextUserPasswor d, password); -
CFDictionarySetValue(myDictionary, kCGPDFContextOwnerPasswo rd, password); -
} -
-
pdfContext = CGPDFContextCreateWithUR L (url, &pageRect, myDictionary); -
CFRelease(myDictionary); -
CFRelease(url); -
pageDictionary = CFDictionaryCreateMutabl e(NULL, -
0, -
&kCFTypeDictionaryKeyCall Backs, -
&kCFTypeDictionaryValueCa llBacks); -
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]stringByAppendingPathCom ponent: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