iOS对PDF加密,解密
保护PDF内容为了保护PDF内容,我们可以在辅助字典中指定一些安全选项并传递给CGPDFContextCreate。我们可以通过包含如下关键字来设置所有者密码、用户密码、PDF是否可以被打印或拷贝:
·kCGPDFContextOwnerPassword: 定义PDF文档的所有者密码。如果指定该值,则文档使用所有者密码来加密;否则文档不加密。该关键字的值必须是ASCII编码的CFString对象。只有前32位是用于密码的。该值没有默认值。如果该值不能表示成ASCII,则无法创建文档并返回NULL。Quartz使用40-bit加密。
·kCGPDFContextUserPassword: 定义PDF文档的用户密码。如果文档加密了,则该值是文档的用户密码。如果没有指定,则用户密码为空。该关键字的值必须是ASCII编码的CFString对象。只有前32位是用于密码的。如果该值不能表示成ASCII,则无法创建文档并返回NULL。
·kCGPDFContextAllowsPrinting:指定当使用用户密码锁定时文档是否可以打印。该值必须是CFBoolean对象。默认值是kCGBooleanTrue。
·kCGPDFContextAllowsCopying: 指定当使用用户密码锁定时文档是否可以拷贝。该值必须是CFBoolean对象。默认值是kCGBooleanTrue。
代码清单14-4(下一章)显示了确认PDF文档是否被锁定,及用密码打开文档。
在创建PDF文件设置密码
使用Quartz创建PDF与绘制其它图形上下文一下简单。我们指定一个PDF文件地址,设置一个PDF图形上下文,并使用与其它图形上下文一样的绘制程序。如代码清单13-4所示的MyCreatePDFFile函数,显示了创建一个PDF的所有工作。
注意,代码在CGPDFContextBeginPage和CGPDFContextEndPage中来绘制PDF。我们可以传递一个CFDictionary对象来指定页属性,包括media, crop, bleed,trim和art boxes。
void MyCreatePDFFile (CGRectpageRect, const char *filename)
{
CGContextRef pdfContext;
CFStringRef path;
CFURLRef url;
CFData boxData = NULL;
CFMutableDictionaryRef myDictionary = NULL;
CFMutableDictionaryRef pageDictionary = NULL;
path = CFStringCreateWithCString (NULL, filename, kCFStringEncodingUTF8);
url = CFURLCreateWithFileSystemPath (NULL, path, kCFURLPOSIXPathStyle, 0);
CFRelease (path);
myDictionary = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(myDictionary, kCGPDFContextTitle, CFSTR("MyPDF File"));
CFDictionarySetValue(myDictionary, kCGPDFContextCreator, CFSTR("MyName"));
CFDictionarySetValue(myDictionary, kCGPDFContextOwnerPassword, CFSTR("zhoumin"));
CFDictionarySetValue(myDictionary, kCGPDFContextUserPassword, CFSTR("zhoumin"));
---------------------------------
//zhoumin加入
//kCGPDFContextOwnerPassword,kCGPDFContextUserPassword这两个选项是对pdf加密
---------------------------------
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, &pageRect);
myDrawContent (pdfContext);
CGPDFContextEndPage (pdfContext);
CGContextRelease (pdfContext);
CFRelease(pageDictionary);
CFRelease(boxData);
}
PDF解密
------------------------------------------------------------------
CGPDFDocumentRef pdf;
pdf = CGPDFDocumentCreateWithURL(pdfURL);
if (pdf == NULL) {
NSLog(@"can't open '%@'", pdfURL);
CFRelease (pdfURL);
}
if (CGPDFDocumentIsEncrypted (pdf)) {//判断pdf是否加密 www.zzzyk.com
if (!CGPDFDocumentUnlockWithPassword (pdf, "")) {//判断密码是否为""
NSString *password = @"zhoumin";
if (password != NULL) {
if (!CGPDFDocumentUnlockWithPassword (pdf, [password UTF8String]))
//使用password对pdf进行解密,密码有效返回yes
NSLog(@"invalid password.");
}
}
}
if (!CGPDFDocumentIsUnlocked (pdf)) {//判断pdf是否打开状态
NSLog(@"CGPDFDocumentIsUnlocked");
}
if (CGPDFDocumentGetNumberOfPages(pdf) == 0) {
NSLog(@"CGPDFDocumentGetNumberOfPages == 0");
}
------------------------------------------------------------------
补充:移动开发 , 其他 ,