ios - 使用密码保存 PDF iOS

标签 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 并设置密码,而不必绘制每个页面?

提前致谢

最佳答案

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

关于ios - 使用密码保存 PDF iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19861666/

相关文章:

javascript - 如何强制下载 PDF 作为后备?

ios - 延迟显示异步获取的项目

ios - 在没有 baseURL 的 UIWebView 中加载 PDF

java - iText-在页面不同位置的 pdf 表格单元格短语中附加阿拉伯文本

c# - 在 MigraDoc 表中插入 "http"图像

java - 如何将 url 作为 pdf 下载到本地文件中?

ios - 推送通知功能 ios

ios - 创建单独的 swift 文件来处理我需要在整个应用程序中使用的函数的最佳方法是什么

ios - 如何创建像这样的 Onboarding/WalkThrough/App-intro swift 3

ios - GCD 和 iOs 中的多个委托(delegate)