Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 用Quartz解析pdf中的多媒体_Parsing_Ios_Pdf_Quartz 2d - Fatal编程技术网

Parsing 用Quartz解析pdf中的多媒体

Parsing 用Quartz解析pdf中的多媒体,parsing,ios,pdf,quartz-2d,Parsing,Ios,Pdf,Quartz 2d,我一直在尝试解析一个屏幕注释,它引用了pdf文件中的一个文件,但我无法控制流。应该存在的东西,比如EmbeddedFiles数组或Dests字典都不存在。我使用adobe acrobat pro 9生成了pdf,该pdf与reader 6或更高版本兼容,以避免flash视频强制转换 解析这个坏男孩时截取的代码是 CGPDFStringRef aTitle; // title is optional property. if (!CGPDFDictionaryGetString

我一直在尝试解析一个屏幕注释,它引用了pdf文件中的一个文件,但我无法控制流。应该存在的东西,比如EmbeddedFiles数组或Dests字典都不存在。我使用adobe acrobat pro 9生成了pdf,该pdf与reader 6或更高版本兼容,以避免flash视频强制转换

解析这个坏男孩时截取的代码是

    CGPDFStringRef aTitle; // title is optional property. 
    if (!CGPDFDictionaryGetString(annotDict, "T", &aTitle)) {
#if DEBUG
        NSLog(@"PDFScrollView parseScreen -> screen annot has no title");
#endif
        //return;
    }else {
#if DEBUG
    char *screenTitle = (char*)CGPDFStringGetBytePtr(aTitle);

    NSLog(@"PDFScrollView parseScreen -> screen  title %s",screenTitle);
#endif
    }

    // get action
    CGPDFDictionaryRef actionDict;
    if(!CGPDFDictionaryGetDictionary(annotDict, "A", &actionDict)) {
        return;
    }

    // parse action

    const char* name;

    if (!CGPDFDictionaryGetName(actionDict, "S", &name)) {
#if DEBUG
        NSLog(@"PDFScrollView parseScreen -> screen annot has name attrib");
#endif
        return;
    }

    NSString *actionType = [[NSString alloc] initWithCString:name];

    if (![actionType isEqualToString:RENDITION_ACTION_TYPE]) {
#if DEBUG
        NSLog(@"PDFScrollView parseScreen -> screen annot action is not rendition");
#endif
        return;
    }
    [actionType release];
    actionType = nil;
    // get the rendition from the action dictionary
    CGPDFDictionaryRef renditionDict;
    if (!CGPDFDictionaryGetDictionary(actionDict, "R", &renditionDict)) {
#if DEBUG
        NSLog(@"PDFScrollView parseScreen -> rendition action does not have rendition");
#endif      
        return;
    }
    // check if the rendition is media or selector
    const char *renditionType;
    if (!CGPDFDictionaryGetName(renditionDict, "S", &renditionType)) {
#if DEBUG
        NSLog(@"PDFScrollView parseScreen -> rendition does not have type");
#endif  
        return;
    }
    // check rendition type
#if DEBUG
    NSLog( @"rendition type %s",renditionType);
#endif
    NSString *rendTypeString = [[NSString alloc]initWithCString:renditionType];
    if (![rendTypeString isEqualToString:@"MR"]) {
#if DEBUG
        NSLog( @"PDFScrollView parseScreen ->rendition type is not  MR --> %s",renditionType);
#endif
        return;

    }
    [rendTypeString release];
    rendTypeString =nil;
    // get media clip dictionary

    CGPDFDictionaryRef mediaclipDict;
    if (!CGPDFDictionaryGetDictionary(renditionDict, "C", &mediaclipDict)) {
#if DEBUG
        NSLog( @"PDFScrollView parseScreen ->rendition dictionary does not contain clip");
#endif
        return;
    }


    const char * mediaClipType;
    if (!CGPDFDictionaryGetName(mediaclipDict, "Type", &mediaClipType)) { // optional
#if DEBUG
        NSLog( @"PDFScrollView parseScreen ->media clip dictionary does not contain name");
#endif


    } else {
#if DEBUG
        NSLog(@"PDFScrollView parseScreen ->media clip object dictionary name %s",mediaClipType);
#endif
    }

    char const *mediaClipSubtype;
    if (!CGPDFDictionaryGetName(mediaclipDict, "S", &mediaClipSubtype)) { // required
#if DEBUG
        NSLog( @"PDFScrollView parseScreen ->media clip dictionary does not contain name");
#endif

        return;
    } 

    NSString *mediaClipSubtypeString = [[NSString alloc] initWithCString:mediaClipSubtype];
    if (![mediaClipSubtypeString isEqualToString:@"MCD"]) {
#if DEBUG
        NSLog( @"PDFScrollView parseScreen ->media clip subtype is not MCD ==>%@",mediaClipSubtype);
#endif      
        return;
    }

    [mediaClipSubtypeString release];
    mediaClipSubtype = nil;

    // get media clip name

    CGPDFStringRef mediaClipName;
    if (!CGPDFDictionaryGetString (mediaclipDict, "N", &mediaClipName)) { // optional
#if DEBUG
        NSLog( @"PDFScrollView parseScreen ->media clip dictionary does not contain name");
#endif

    } else {
#if DEBUG
        NSLog(@"PDFScrollView parseScreen ->media clip object dictionary name %s",mediaClipName);
#endif
    }

    // get ASCII MIME type
    CGPDFStringRef mimeType;
    if(!CGPDFDictionaryGetString(mediaclipDict, "CT", &mimeType)) {

#if DEBUG
        NSLog(@"PDFScrollView parseScreen ->media clip object does not contain mime type");
#endif
    }else {
#if DEBUG
        NSLog(@"PDFScrollView parseScreen ->media clip object mime type %s",CGPDFStringGetBytePtr(mimeType));
#endif
    }


    // get content stream

    CGPDFDictionaryRef contentDict ;
    if (!CGPDFDictionaryGetDictionary(mediaclipDict, "D", &contentDict)) {
#if DEBUG
        NSLog(@"PDFScrollView parseScreen ->media clip object does not contain content dict");

#endif
        return;
    }

    //check content type
    const char *contentType;

    if (!CGPDFDictionaryGetName(contentDict, "Type", &contentType)) {
#if DEBUG
        NSLog(@"PDFScrollView parseScreen ->content dict does not have type");

#endif      
    }else {

#if DEBUG
        NSLog(@"PDFScrollView parseScreen ->content dict type %s",contentType);

#endif
    }
    // get file system
    const char *fileSystem;
    if (!CGPDFDictionaryGetName(contentDict, "FS", &fileSystem)) {
#if DEBUG
        NSLog(@"PDFScrollView parseScreen ->content dict does not have type");

#endif      
    }else {

#if DEBUG
        NSLog(@"PDFScrollView parseScreen ->content dict type %s",fileSystem    );

#endif
    }

#if DEBUG 
    CGPDFStringRef description;
    if (!CGPDFDictionaryGetString (contentDict, "UF", &description)) {

        NSLog(@"PDFScrollView parseScreen ->content dict does not have type");


    }else {
        NSLog(@"PDFSCrollView parseScreen -> contentdict UF %s",CGPDFStringGetBytePtr(description));
    }

#endif
    // check whether it is a file specification
    if (strcmp(contentType, "Filespec")!=0) { // it is Filespec
#if DEBUG
        NSLog(@"PDFScrollView parseScreen ->content dict type %s is not file specification",contentType);

#endif
        return;
    }
    CGPDFStringRef fstring;// I get the file title 
    if (!CGPDFDictionaryGetString (contentDict, "F", &fstring)) {
#if DEBUG
        NSLog(@"PDFScrollView parseScreen ->content dict does not have F string");

#endif      
    }

#if DEBUG
        NSLog(@"PDFScrollView parseScreen ->content f string %s",CGPDFStringGetBytePtr(fstring));

#endif
    CGPDFStreamRef str;// here there's no stream at all
    if (!CGPDFDictionaryGetStream  (contentDict, "F", &str)) {
#if DEBUG
        NSLog(@"PDFScrollView parseScreen ->content dict does not have F string");

#endif      
    }

    // reference file
    CGPDFArrayRef referencedFileDict ;
    /*** does not find the RF ****/
    if (!CGPDFDictionaryGetArray (contentDict, "RF", &referencedFileDict)) {
#if DEBUG
        NSLog(@"PDFScrollView parseScreen ->content dict does not contain Referenced file dictionary RF");

#endif  
    }


    CGPDFDictionaryRef embeddedFileDict ;

    if (!CGPDFDictionaryGetDictionary(contentDict, "EF", &embeddedFileDict)) {
#if DEBUG
        NSLog(@"PDFScrollView parseScreen ->content dict does not contain embedded file dictionary EF");

#endif  
    }
    // EF is found sucessfully

    CGPDFDictionaryRef documentCatalog = CGPDFDocumentGetCatalog(_docRef);

    CGPDFDictionaryRef namesDict;


    if (!CGPDFDictionaryGetDictionary (documentCatalog, "Names", &namesDict)) { // optional
#if DEBUG
        NSLog( @"PDFScrollView parseScreen ->documentCatalog does not contain Names dict");
#endif
        //return;

    } 

    CGPDFDictionaryRef destsDict;


    if (!CGPDFDictionaryGetDictionary (documentCatalog, "Dests", &destsDict)) { // optional
#if DEBUG
        NSLog( @"PDFScrollView parseScreen ->documentCatalog does not contain Names dict");
#endif
        //return;

    } 


    CGPDFDictionaryRef embeddedFilesDict ;

    if (!CGPDFDictionaryGetDictionary(namesDict, "EmbeddedFiles", &embeddedFilesDict)) {
#if DEBUG
        NSLog( @"PDFScrollView parseScreen ->namesDict does not contain embeddedFiles dict");
#endif
        return;

    }

    CGPDFArrayRef namesArray;
    if (!CGPDFDictionaryGetArray(namesDict, "Names", &namesArray)) {
#if DEBUG
        NSLog( @"PDFScrollView parseScreen ->names Dict does not contain Names");
#endif
        return;

    }
此服务器的控制台输出

2011-02-05 01:59:35.324 xxxxxxxxxx[62350:207] -> parseLink annotation subtype Screen
2011-02-05 01:59:35.325 xxxxxxxxxx[62350:207]  parseScreen -> screen  title Annotation from Inception_HD.avi
2011-02-05 01:59:35.325 xxxxxxxxxx[62350:207] rendition type MR
2011-02-05 01:59:35.326 xxxxxxxxxx[62350:207]  parseScreen ->media clip dictionary does not contain name
2011-02-05 01:59:35.327 xxxxxxxxxx[62350:207]  parseScreen ->media clip object dictionary name 
2011-02-05 01:59:35.327 xxxxxxxxxx[62350:207]  parseScreen ->media clip object mime type video/avi
Current language:  auto; currently objective-c
2011-02-05 01:59:39.080 xxxxxxxxxx[62350:207]  parseScreen ->content dict type Filespec
2011-02-05 01:59:40.206 xxxxxxxxxx[62350:207]  parseScreen ->content dict does not have type
2011-02-05 01:59:41.647 xxxxxxxxxx[62350:207]  parseScreen -> contentdict UF Inception_HD.avi
2011-02-05 01:59:44.234 xxxxxxxxxx[62350:207]  parseScreen ->content f string Inception_HD.avi
2011-02-05 01:59:45.472 xxxxxxxxxx[62350:207]  parseScreen ->content dict does not have F string
2011-02-05 01:59:47.772 xxxxxxxxxx[62350:207]  parseScreen ->content dict does not contain Referenced file dictionary RF
(gdb) continue
2011-02-05 03:33:13.748 xxxxxxxxxx[62350:207]  parseScreen ->documentCatalog does not contain Names dict
我的想法是获取文件流,将其保存到临时文件中,并像adobe开发人员使用adobe SDK一样播放它


提前感谢

我最终将媒体打包到PDF文件以外的其他文件中。我无法使用Apple Quartz库掌握pdf上的流数据。

您当时是如何从pdf内部引用(外部)媒体文件的?(这篇文章的最后一个答案是外部流不起作用?)到目前为止,我已经看到了两种方法:1-使用方形注释及其元数据2-使用链接及其URL来形成媒体的内部路径。