我已经完成了我的解决方法。我仍然想知道是否有更好的方法来做到这一点,所以如果你知道一个或有任何建议,我愿意尝试。
注意:我只检查bools,整数,字符串和数组,因为根据Apple的文档,这些都应该在PDF中的辅助信息中。数组位未经测试,因为我没有在Aux Info中有数组的PDF。如果有人想对我进行测试或者链接到一个PDF,我会很乐意测试它。
首先,在类标题中创建一个id selfClass
以外的@interface
标记,以便由CGPDFDictionaryApplyFunction
调用的C函数可以访问当前类。还要添加一个NSDictionary *auxInfo
用于存储信息。一旦提取,则NS类型可以很容易地施放这样的:
CFDictionaryRef newDictionary = (CFDictionaryRef)[self auxInfo];
我其实是做了昨晚但认为我必须做的又一轮循环,从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;
}
我今天也遇到了这个问题。仍在研究解决方案。将会检查这个,如果我找到任何东西,也会发布。 – 2010-08-10 22:13:23
谢谢。当我完成后,我会发布我的解决方法。我真的很讨厌它,因为它的效率非常低。在SDK中没有内置方法的情况下可能会达到它的效果,但它很丑陋。 – alunsford3 2010-08-10 22:28:16
是啊,它看起来很讨厌。我个人正在尝试将pdf对象添加到pdfarray或pdf字典中,并遇到无法访问添加或创建或编辑或插入类似CGPDF对象的问题的相同问题。它的笑话真的是api有多糟糕。 – 2010-08-10 22:38:26