2

サーバーから 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);}

これにより、パスワードが設定され、ファイルが保存されますが、1 ページしかありません。PDF全体のコピーを作成するにはどうすればよいですか?

私が見る限り、このスクリプトはすべてのページをループして、ページごとに PDF を描画する必要があります。各ページを描画するのではなく、PDF を複製してパスワードを設定する方法はありますか?

前もって感謝します

4

1 に答える 1

3

iOS では、単純にファイルを複製してパスワードを設定することはできません。ソース ドキュメントのすべてのページをループして、新しいドキュメントに描画する必要があります。
このアプローチの問題点は、ページ コンテンツのみが新しいドキュメントに転送されることです。ソース ドキュメントにブックマーク、注釈、フォーム フィールド、添付ファイルが含まれている場合、それらは新しいドキュメントに転送されません。現時点では、これに対する解決策はありません。

于 2013-11-08T17:02:55.023 に答える