我已經完成了我的解決方法。我仍然想知道是否有更好的方法來做到這一點,所以如果你知道一個或有任何建議,我願意嘗試。
注意:我只檢查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