UIGraphicsBeginPDFContextToFile с приложением сбоя словаря опций - PullRequest
0 голосов
/ 25 октября 2019

Попытка создать PDF, который нельзя изменить каким-либо образом, и тестирование различных вариантов словаря, чтобы увидеть, как они работают. Проблема в том, что, хотя в документации сказано, что я могу использовать одну вещь, она не позволяет мне использовать эту вещь, и происходит сбой приложения. Вот мои настройки:

NSDictionary *tempDict = [NSDictionary dictionaryWithObjectsAndKeys:@"user", kCGPDFContextOwnerPassword, (kCGPDFAllowsCommenting | kCGPDFAllowsLowQualityPrinting), kCGPDFContextAccessPermissions, nil];

UIGraphicsBeginPDFContextToFile(self.savePath, CGRectZero, tempDict);

из документов для UIGraphicsBeginPDFContextToFile:

Словарь, который определяет дополнительную информацию, которая будет связана с файлом PDF. Вы можете использовать эти ключи для указания дополнительных метаданных и информации о безопасности для PDF, например, автора PDF или пароля для доступа к нему. Ключи в этом словаре - это те же ключи, которые вы передаете в функцию CGPDFContextCreate, и они описаны в разделе «Дополнительные ключи словаря» в CGPDFContext. Словарь сохраняется в новом контексте, поэтому по возвращении вы можете безопасно его освободить.

из документов для kCGPDFContextAccessPermissions

/ * Права доступа к документу, выраженные в видеCFNumber. Число определяется путем ORing вместе желаемых значений CGPDFAccessPermissions. * /

CG_EXTERN const CFStringRef kCGPDFContextAccessPermissions
CG_AVAILABLE_STARTING (10.13, 11.0);

из документов для доступа к CGPDFDocument

*
получить *1020* получить 10 *разрешения от CGPDFDocument, вызовите CGPDFDocumentGetAccessPermissions. Установка разрешений // может быть выполнена только с помощью свойства kCGPDFContextAccessPermissions в дополнительном информационном словаре, переданном // в CGPDFContextCreate.

, поэтому, исходя из того, что я собрал, я должен иметь возможность объединять свойства OR, например, так: (kCGPDFAllowsCommenting | kCGPDFAllowsLowQualityPrinting), чтобы поместить их во вспомогательный словарь создания PDF, чтобы затем иметь возможность писать PDF с этими разрешениями или нет. Другая проблема заключается в том, что если я не хочу, чтобы определенные разрешения были включены или выключены? разрешения следующие:

typedef CF_OPTIONS(uint32_t, CGPDFAccessPermissions) {
    kCGPDFAllowsLowQualityPrinting    = (1 << 0),   // Print at up to 150 DPI
    kCGPDFAllowsHighQualityPrinting   = (1 << 1),   // Print at any DPI
    kCGPDFAllowsDocumentChanges       = (1 << 2),   // Modify the document contents except for page management
    kCGPDFAllowsDocumentAssembly      = (1 << 3),   // Page management: insert, delete, and rotate pages
    kCGPDFAllowsContentCopying        = (1 << 4),   // Extract content (text, images, etc.)
    kCGPDFAllowsContentAccessibility  = (1 << 5),   // Extract content, but only for the purpose of accessibility
    kCGPDFAllowsCommenting            = (1 << 6),   // Create or modify annotations, including form field entries
    kCGPDFAllowsFormFieldEntry        = (1 << 7)    // Modify form field entries
};

Я хочу, чтобы поле kCGPDFAllowsDocumentChanges было ВЫКЛЮЧЕНО, чтобы изменения в PDF не могли быть внесены. Я пытался сделать это с помощью записи PDFKit в файл с параметрами, я также пытался с вышеупомянутым, и происходит то же самое. Я могу написать все другие параметры, содержащиеся в CGPDFContext.h, но я не могу написать разрешения для kCGPDFContextAccessPermissions без сбоя системы.

Любая помощь будет признательна, так как ответ на этот вопрос очень важен, поскольку вообще не существует документации или примеров кода, делающего эту работу для отключения kCGPDFAllowsDocumentChanges.

1 Ответ

2 голосов
/ 25 октября 2019

Вы пытаетесь сохранить обычный int (uinit32_t на самом деле) в NSDictionary. Вы не можете сделать это. Вы можете хранить объекты только в NSDictionary. Таким образом, вам нужно обернуть ваше значение в NSNumber.

Используя современный Objective-C, ваш код будет:

NSDictionary *tempDict = @{
    (NSString *)kCGPDFContextOwnerPassword : @"user",
    (NSString *)kCGPDFContextAccessPermissions : @(kCGPDFAllowsCommenting | kCGPDFAllowsLowQualityPrinting)
};
...