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)
您可以通过绘制 into 来完成您所描述的内容CGPDFContext
,但如果您有一个复杂的 PDF,您可能会尝试超出 API 预期用途的操作。您可以查看PDF 规范的第 3.4 节并了解您要了解的内容。
归档时间: |
|
查看次数: |
6180 次 |
最近记录: |