首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从pdf文件中的FileAttachment注释中获取EmbeddedFiles

如何从pdf文件中的FileAttachment注释中获取EmbeddedFiles
EN

Stack Overflow用户
提问于 2013-09-05 14:59:43
回答 1查看 442关注 0票数 3

我正在做PDF注解应用程序,我在iPhone中添加了PDF文件注解,它工作得很好,它的注解也对任何读者都可见,但面临一个问题,如何从文件附件注解中获取PDF文件中的EmbeddedFiles,它是从桌面创建的注解,如何解决这个问题?

我使用这个代码从文件附件注释中获取注释的内容和位置,它工作得很好

代码语言:javascript
复制
 CGPDFDictionaryRef pageDictionary = CGPDFPageGetDictionary(pPage);
      //  NSLog(@"%@",(NSDictionary*)pageDictionary);
        CGPDFArrayRef outputArray;
        if(!CGPDFDictionaryGetArray(pageDictionary, "Annots", &outputArray)) {
            [pdfAnnots release];
            return nil;
        }
     CGPDFArrayRef rectArray;
                if(!CGPDFDictionaryGetArray(annotDict, "Rect", &rectArray)) {
                    break;
                }

                int arrayCount = CGPDFArrayGetCount( rectArray );
                CGPDFReal coords[4];
                for( int k = 0; k < arrayCount; ++k ) {
                    CGPDFObjectRef rectObj;
                    if(!CGPDFArrayGetObject(rectArray, k, &rectObj)) {
                        break;
                    }

                    CGPDFReal coord;
                    if(!CGPDFObjectGetValue(rectObj, kCGPDFObjectTypeReal, &coord)) {
                        break;
                    }

                    coords[k] = coord;
                }               

                CGRect rect = CGRectMake(coords[0],coords[1],coords[2],coords[3]);

                NSLog(@"%@",NSStringFromCGRect(rect));

 CGPDFDictionaryRef aDict;

    if(CGPDFDictionaryGetDictionary(annotDict, "AP", &aDict)) 
    {

      CGPDFStreamRef textStringRef33;
        if(CGPDFDictionaryGetStream(aDict, "N", &textStringRef33)) {



            CGPDFDataFormat *format = NULL;

            CFDataRef contdata = CGPDFStreamCopyData( textStringRef33, format );

            NSData *data=(NSData*)contdata;
   }

请帮帮我

提前谢谢你

EN

回答 1

Stack Overflow用户

发布于 2013-09-18 21:23:30

PDF嵌入与注释不同。嵌入的文件存储在document段而不是page段。

无名文件可以包含嵌入式文件,但其提取机制不同。

首先,您应该看到annotation对象的内部结构。您可以像这样使用函数:

代码语言:javascript
复制
static void op_Applier(const char *key, CGPDFObjectRef value, void *info) {
    if (*(int *)info > 6) {
        return;
    }
    const char *valuestr = NULL;
    CGPDFObjectType type = CGPDFObjectGetType(value);
    int i = 0;
    for (i = 0; i < *(int *)info; i++) {
        printf("\t");
    }
    printf("%s", key);
    switch (type) {
        case kCGPDFObjectTypeBoolean: {
            bool b;
            CGPDFObjectGetValue(value, type, &b);
            printf(" (boolean) : %s\n", (b)?"true":"false");
        }
            break;
        case kCGPDFObjectTypeInteger: {
            int64_t i;
            CGPDFObjectGetValue(value, type, &i);
            printf(" (integer) : %lld\n", i);
        }
            break;
        case kCGPDFObjectTypeReal: {
            CGPDFReal f;
            CGPDFObjectGetValue(value, type, &f);
            printf(" (real) : %f\n", f);
        }
            break;
        case kCGPDFObjectTypeName:{
            CGPDFObjectGetValue(value, type, (void *)&valuestr);
            printf(" (name) : %s\n", valuestr);
        }
            break;
        case kCGPDFObjectTypeString: {
            CGPDFStringRef str;
            CGPDFObjectGetValue(value, type, &str);
            printf(" (string) : %s\n", CGPDFStringGetBytePtr(str));
        }
            break;
        case kCGPDFObjectTypeArray: {
            printf(" (array)\n");
            CGPDFArrayRef arr;
            CGPDFObjectGetValue(value, type, &arr);

            int t = *(int *)info + 1;
            int j;
            size_t size = CGPDFArrayGetCount(arr);
            for (j = 0; j < size; j ++) {
                CGPDFObjectRef obj;
                CGPDFArrayGetObject(arr, j, &obj);
                char buf[4] = {0};
                sprintf(buf, "%d", j);
                op_Applier(buf, obj, &t);
            }
        }
            break;
        case kCGPDFObjectTypeDictionary: {
            printf(" (dictionary)\n");
            CGPDFDictionaryRef dict;
            CGPDFObjectGetValue(value, type, &dict);
            int t = *(int *)info + 1;
            CGPDFDictionaryApplyFunction(dict, &op_Applier, &t);
        }
            break;
        case kCGPDFObjectTypeStream:
            printf(" (stream)\n");
            break;
        default:
            printf(" (NULL)\n");
            break;
    }
}

int t = 0; op_Applier("MyDictionary", yourAnnotationDictionary, &t);

其次,你应该找到你的文件的路径(它将是stream对象),并移动到这个对象。这可以使用CGPDFDictionary方法来完成。

第三,从流中获取NSData,并保存它

代码语言:javascript
复制
CGPDFDataFormat format;
CFDataRef data = CGPDFStreamCopyData(stream, &format);

[((__bridge NSData *)data) writeToURL:resultUrl atomically:NO];

CFRelease(data);

P.S.PDF批注的PostScript语法可以不同。不同的库使用不同的语法,你应该实现所有的可能性来制作app,它几乎适用于所有的PDF文件。示例可在this file in vfr Reader中找到

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18629754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档