当前位置:编程学习 > wap >>

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");
 
        }
 
 
 
------------------------------------------------------------------
 
 
 
 
补充:移动开发 , 其他 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,