CGPDFDictionaryRef有用的东西

alu*_*rd3 7 pdf iphone dictionary

一点背景:我正在将图像附加到现有的pdf文件中.我发现没有办法只添加一个页面,你必须重新创建整个pdf,然后删除旧的,然后移动新的.(如果这是错的,告诉我,这将为我节省很多麻烦.)我已经完成了那部分,但我现在正在尝试复制辅助信息(标题,作者,密钥等).问题是有很多类型问题,我正在使用的当前方法是获取CGPDFDocumentRef的CGPDFDictionaryRef,然后调用CGPDFDictionaryApplierFunction.在我传递的C函数中,我将每个键提取到一个NSMutableDictionary,这样我就可以对这些值执行某些操作,而不是将它们锁定在这种可怕的CGPDF格式中.

所以基本上我的问题是:有更好的方法吗?我盯着那么多我无法想象的文档文件,但我真的希望我有,因为我不得不做的工作量越来越荒谬.

alu*_*rd3 11

我已经完成了我的解决方法.我仍然想知道是否有更好的方法来做到这一点,所以如果你知道一个或有任何建议我愿意尝试它们.

注意:我只检查bool,int,字符串和数组,因为根据Apple的文档,所有这些都应该在PDF中的辅助信息中.数组位未经测试,因为我在Aux Info中没有带有数组的PDF.如果有人想为我测试一下或者链接到带有一个的pdf,我很乐意测试它.

首先,在类标题中创建一个标记id selfClass外部,@interface以便被调用的C函数CGPDFDictionaryApplyFunction可以访问当前类.还添加一个NSDictionary *auxInfo用于存储信息.一旦提取,NS类型可以很容易地像这样:

CFDictionaryRef newDictionary = (CFDictionaryRef)[self auxInfo];
Run Code Online (Sandbox Code Playgroud)

我昨晚实际上已经完成但是我认为我必须再做一轮循环才能从NS转换为CF,忘记它们是无令牌的桥接.所以你有它,希望每个人都能从我的工作中受益.如果您需要澄清,请提出问题.再一次,如果有更简单的方法,如果只是优化我的代码,请说出来.我知道这不是一个非常优雅的方法,但它现在有效.

- (void)extractPDFDictionary:(CGPDFDocumentRef)pdf{
    NSLog(@"extractingPDFDictionary");
    CGPDFDictionaryRef oldDict = CGPDFDocumentGetInfo(pdf);
    CGPDFDictionaryApplyFunction(oldDict, copyDictionaryValues, NULL);
}

void copyDictionaryValues (const char *key, CGPDFObjectRef object, void *info) {
    NSLog(@"key: %s", key);
    CGPDFObjectType type = CGPDFObjectGetType(object);
    switch (type) {
        case kCGPDFObjectTypeString: {
            CGPDFStringRef objectString;
            if (CGPDFObjectGetValue(object, kCGPDFObjectTypeString, &objectString)) {
                NSString *tempStr = (NSString *)CGPDFStringCopyTextString(objectString);
                [[selfClass auxInfo] setObject:tempStr
                                         forKey:[NSString stringWithCString:key encoding:NSUTF8StringEncoding]];
                [tempStr release];
                NSLog(@"set string value");
            }
        }
        case kCGPDFObjectTypeInteger: {
            CGPDFInteger objectInteger;
            if (CGPDFObjectGetValue(object, kCGPDFObjectTypeInteger, &objectInteger)) {
                [[selfClass auxInfo] setObject:[NSNumber numberWithInt:objectInteger]
                                         forKey:[NSString stringWithCString:key encoding:NSUTF8StringEncoding]];
                NSLog(@"set int value");
            }
        }
        case kCGPDFObjectTypeBoolean: {
            CGPDFBoolean objectBool;
            if (CGPDFObjectGetValue(object, kCGPDFObjectTypeBoolean, &objectBool)) {
                [[selfClass auxInfo] setObject:[NSNumber numberWithBool:objectBool]
                                         forKey:[NSString stringWithCString:key encoding:NSUTF8StringEncoding]];
                NSLog(@"set boolean value");
            }
        }
        case kCGPDFObjectTypeArray : {
            CGPDFArrayRef objectArray;
            if (CGPDFObjectGetValue(object, kCGPDFObjectTypeArray, &objectArray)) {
                NSArray *tempArr = [selfClass copyPDFArray:objectArray];
                [[selfClass auxInfo] setObject:tempArr
                                         forKey:[NSString stringWithCString:key encoding:NSUTF8StringEncoding]];
                [tempArr release];
                NSLog(@"set array value");
            }
        }

    }
}

- (NSArray *)copyPDFArray:(CGPDFArrayRef)arr{
    int i = 0;
    NSMutableArray *temp = [[NSMutableArray alloc] init];
    for(i=0; i<CGPDFArrayGetCount(arr); i++){
        CGPDFObjectRef object;
        CGPDFArrayGetObject(arr, i, &object);
        CGPDFObjectType type = CGPDFObjectGetType(object);
        switch(type){
            case kCGPDFObjectTypeString: {
                CGPDFStringRef objectString;
                if (CGPDFObjectGetValue(object, kCGPDFObjectTypeString, &objectString)) {
                    NSString *tempStr = (NSString *)CGPDFStringCopyTextString(objectString);
                    [temp addObject:tempStr];
                    [tempStr release];
                }
            }
            case kCGPDFObjectTypeInteger: {
                CGPDFInteger objectInteger;
                if (CGPDFObjectGetValue(object, kCGPDFObjectTypeInteger, &objectInteger)) {
                    [temp addObject:[NSNumber numberWithInt:objectInteger]];
                }
            }
            case kCGPDFObjectTypeBoolean: {
                CGPDFBoolean objectBool;
                if (CGPDFObjectGetValue(object, kCGPDFObjectTypeBoolean, &objectBool)) {
                    [temp addObject:[NSNumber numberWithBool:objectBool]];
                }
            }
            case kCGPDFObjectTypeArray : {
                CGPDFArrayRef objectArray;
                if (CGPDFObjectGetValue(object, kCGPDFObjectTypeArray, &objectArray)) {
                    NSArray *tempArr = [selfClass copyPDFArray:objectArray];
                    [temp addObject:tempArr];
                    [tempArr release];
                }
            }
        }
    }
    return temp;
}
Run Code Online (Sandbox Code Playgroud)


jbm*_*jbm 0

您可以通过绘制 into 来完成您所描述的内容CGPDFContext,但如果您有一个复杂的 PDF,您可能会尝试超出 API 预期用途的操作。您可以查看PDF 规范的第 3.4 节并了解您要了解的内容。