`
z251257144
  • 浏览: 89405 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

[iOS]iOS对PDF加密,解密

    博客分类:
  • iOS
阅读更多

保护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加入

 

    //kCGPDFContextOwnerPasswordkCGPDFContextUserPassword这两个选项是对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是否加密

            if (!CGPDFDocumentUnlockWithPassword (pdf, "")) {//判断密码是否为""

                NSString *password = @"zhoumin";

                if (password != NULL) {

                    if (!CGPDFDocumentUnlockWithPassword (pdf, [password UTF8String]))

                        //使用passwordpdf进行解密,密码有效返回yes

                        NSLog(@"invalid password.");

                }

            }

        }

 

        if (!CGPDFDocumentIsUnlocked (pdf)) {//判断pdf是否打开状态

            NSLog(@"CGPDFDocumentIsUnlocked");

        }

 

        if (CGPDFDocumentGetNumberOfPages(pdf) == 0) {

            NSLog(@"CGPDFDocumentGetNumberOfPages == 0");

        }

 

------------------------------------------------------------------

 

 

苹果官方文档

http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_pdf_scan/dq_pdf_scan.html#//apple_ref/doc/uid/TP30001066-CH220-CJBDCGCB

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics