Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating Password Protected PDF in Objective-C

I tried using the info given here

https://developer.apple.com/library/mac/#documentation/graphicsimaging/conceptual/drawingwithquartz2d/dq_pdf/dq_pdf.html#//apple_ref/doc/uid/TP30001066-CH214-TPXREF101

but it is really vague...

I also tried using this code using UIKit... the file is created.. but it is of 0 kb.. cannot write any data..

BOOL allowCopy=YES;
BOOL allowPrint=YES;
//NSString *password=@"test";

CGContextRef pdfContext; //our pdfContext

CFStringRef path;

CFURLRef url;

CGRect pageRect = CGRectMake(0, 0,500, 500);

NSString *fileName=@"Test.pdf";
// CFStringRef passwordString = (__bridge_retained CFStringRef)password;

const char *filename = [fileName UTF8String];

// Create a CFString from the filename we provide to this method when we call it
path = CFStringCreateWithCString (NULL, filename, kCFStringEncodingUTF8);

// Create a CFURL using the CFString we just defined
url = CFURLCreateWithFileSystemPath (NULL, path, kCFURLPOSIXPathStyle, 0);

CFMutableDictionaryRef myDictionary = NULL;
// This dictionary contains extra options mostly for 'signing' the PDF

myDictionary = CFDictionaryCreateMutable(NULL, 0,
                                         &kCFTypeDictionaryKeyCallBacks,
                                         &kCFTypeDictionaryValueCallBacks);

CFDictionarySetValue(myDictionary, kCGPDFContextOwnerPassword, CFSTR("user"));
CFDictionarySetValue(myDictionary, kCGPDFContextUserPassword, CFSTR("user"));

if (!allowCopy) 
    CFDictionarySetValue(myDictionary, kCGPDFContextAllowsCopying, kCFBooleanFalse);     
//kCGPDFContextAllowsCopying is set to TRUE by default

if (!allowPrint) 
    CFDictionarySetValue(myDictionary, kCGPDFContextAllowsPrinting, kCFBooleanFalse);    
//kCGPDFContextAllowsPrinting is set to TRUE by default

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:fileName];

if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
    [[NSFileManager defaultManager] createFileAtPath:dataPath contents:nil attributes:nil];
// CGRect papersize= CGRectMake(0, 0, 400, 400);

pdfContext = CGPDFContextCreateWithURL (url, &pageRect, myDictionary);

// Cleanup our mess
CFRelease(myDictionary);

CFRelease(url);

//Now, this is a tricky part. We make use of a do - while loop in order to create as many pages as needed

CGContextBeginPage (pdfContext, &pageRect); //begins a new PDF page

//create layout for our page

CGRect bounds = CGRectMake(0, 0,500,500);

UIGraphicsPushContext(pdfContext); //pushing the context, as explained at the beginning of this post

CGContextSaveGState(pdfContext);

CGContextTranslateCTM(pdfContext, 0, bounds.origin.y);

CGContextScaleCTM(pdfContext, 1, -1);

CGContextTranslateCTM(pdfContext, 0, -(bounds.origin.y + bounds.size.height));

//[@"HELLO" drawInRect:CGRectMake(10,15,10,30) withFont:[UIFont fontWithName:@"Helvetica-Bold" size:40]];

//THIS IS THE NASTY PART
CGContextRestoreGState(pdfContext);

UIGraphicsPopContext();

CGContextEndPage (pdfContext); //ends the current page

// We are done with our context now, so we release it

CGContextRelease (pdfContext);

CFRelease(path);

// Create our PDF Context with the CFURL, the CGRect we provide, and the above defined dictionary

if anyone can help.. thanks..

like image 957
Kush Avatar asked Nov 04 '22 04:11

Kush


1 Answers

Modify the listing 13-4 and add the lines below that are placed between comments:

CFDictionarySetValue(myDictionary, kCGPDFContextTitle, CFSTR("My PDF File"));
CFDictionarySetValue(myDictionary, kCGPDFContextCreator, CFSTR("My Name"));
///
CFDictionarySetValue(myDictionary, kCGPDFContextUserPassword, CFSTR("userpassword"));
CFDictionarySetValue(myDictionary, kCGPDFContextOwnerPassword, CFSTR("ownerpassword"));
///
pdfContext = CGPDFContextCreateWithURL (url, &pageRect, myDictionary); 

The supported security options are listed at the end of the article.

like image 178
iPDFdev Avatar answered Nov 09 '22 06:11

iPDFdev