使用密码iOS保存PDF

时间:2013-11-08 14:38:57

标签: ios pdf

我正在构建一个从服务器下载PDF文件的应用程序,添加密码然后在本地保存文件。

我很难为文件添加密码。下面是我运行设置密码并保存文件的功能。

- (void)addPassword:(NSString *)password forPDFAtPath:(NSString *)path {
NSData *data = [NSData dataWithContentsOfFile:path];

//Create the pdf document reference
CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((CFDataRef)data);
CGPDFDocumentRef document = CGPDFDocumentCreateWithProvider(dataProvider);

//Create the pdf context
CGPDFPageRef page = CGPDFDocumentGetPage(document, 1); //Pages are numbered starting at 1
CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
CFMutableDataRef mutableData = CFDataCreateMutable(NULL, 0);



CFMutableDictionaryRef ref = CFDictionaryCreateMutable(NULL,
                                                       0,
                                                       &kCFTypeDictionaryKeyCallBacks,
                                                       &kCFTypeDictionaryValueCallBacks);

CFDictionarySetValue(ref, kCGPDFContextUserPassword, (__bridge CFStringRef)password);
CFDictionarySetValue(ref, kCGPDFContextOwnerPassword, (__bridge CFStringRef)password);

CGDataConsumerRef dataConsumer = CGDataConsumerCreateWithCFData(mutableData);
CGContextRef pdfContext = CGPDFContextCreate(dataConsumer, &pageRect, ref);

if (CGPDFDocumentGetNumberOfPages(document) > 0) {
    //Draw the page onto the new context
    page = CGPDFDocumentGetPage(document, 1); //Pages are numbered starting at 1

    CGPDFContextBeginPage(pdfContext, NULL);
    CGContextDrawPDFPage(pdfContext, page);
    CGPDFContextEndPage(pdfContext);

} else {
    NSLog(@"Failed to create the document");
}

CGContextRelease(pdfContext); //Release before writing data to disk.

//Write to disk
[(__bridge NSData *)mutableData writeToFile:path atomically:YES];

//Clean up
CGDataProviderRelease(dataProvider); //Release the data provider
CGDataConsumerRelease(dataConsumer);
CGPDFDocumentRelease(document);
CFRelease(mutableData);}

这会设置密码并保存文件但只有一页。我如何创建整个PDF的副本?

从我可以看到,这个脚本需要循环遍历所有页面并逐页绘制PDF。有没有办法可以简单地复制PDF并设置密码而不必绘制每个页面?

提前致谢

1 个答案:

答案 0 :(得分:3)

在iOS上,您不能简单地复制文件并设置密码。您必须遍历源文档的所有页面并在新文档中绘制它们。
这种方法的问题是只有页面内容被转移到新文档。如果源文档包含书签,注释,表单域,附件,则它们将不会转移到新文档。目前没有解决方案。