2012-04-17 2 views
2

PDF 패키지에 포함 된 PDF 문서를 추출하는 데 시간이 많이 걸렸습니다. 어디서나 문서 나 예제 코드를 찾지 못했지만 Adobe Reader 앱과 PDFExpert 앱이 지원하므로 불가능하지 않습니다. 그들이 자신의 파서를 가지고, 내가 그에게 오지 않는 희망 수 ...PDF iOS의 패키지

크게 될

편집 감사합니다 올바른 방향으로 날 가리 킵니다 모든 힌트 : 오랜 시간 후 나는 이것에 대한 작업으로 돌아가서 마침내 그것을 알아 냈다. 올바른 방향으로 나를 가리키는 iPDFDev에게 특별 감사합니다 !! PDF 패키지에 의해

NSURL *url = [NSURL fileURLWithPath:filePath isDirectory:NO]; 
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((__bridge CFURLRef)url); 
CGPDFDictionaryRef catalog = CGPDFDocumentGetCatalog(pdf); 

CGPDFDictionaryRef names = NULL; 
if (CGPDFDictionaryGetDictionary(catalog, "Names", &names)) { 
    CGPDFDictionaryRef embFiles = NULL; 
    if (CGPDFDictionaryGetDictionary(names, "EmbeddedFiles", &embFiles)) { 
     // At this point you know this is a Package/Portfolio 

     CGPDFArrayRef nameArray = NULL; 
     CGPDFDictionaryGetArray(embFiles, "Names", &nameArray); 

     // nameArray contains the inner documents 
     // it brings the name and then a dictionary from where you can extract the pdf 

     for (int i = 0; i < CGPDFArrayGetCount(nameArray); i+=2) { 
      CGPDFStringRef name = NULL; 
      CGPDFDictionaryRef dict = NULL; 

      if (CGPDFArrayGetString(nameArray, i, &name) && 
       CGPDFArrayGetDictionary(nameArray, i+1, &dict)) { 
       NSString *_name = [self convertPDFString:name]; 

       CGPDFDictionaryRef EF; 
       if (CGPDFDictionaryGetDictionary(dict, "EF", &EF)) { 
        CGPDFStreamRef F; 
        if (CGPDFDictionaryGetStream(EF, "F", &F)) { 
         CFDataRef data = CGPDFStreamCopyData(F, NULL); 
         CGDataProviderRef provider = CGDataProviderCreateWithCFData(data); 

         CGPDFDocumentRef _doc = CGPDFDocumentCreateWithProvider(provider); 
         if (_doc) { 
          // save the docRef somewhere (_doc) 
          // save the pdf name somewhere (_name) 
         } 

         CFRelease(data); 
         CGDataProviderRelease(provider); 
        } 
       } 
      } 
     } 
    } 
} 



- (NSString *)convertPDFString:(CGPDFStringRef)string { 
    CFStringRef cfString = CGPDFStringCopyTextString(string); 
    NSString *result = [[NSString alloc] initWithString:(__bridge NSString *)cfString]; 
    CFRelease(cfString); 
    return result; 
} 
+0

작동 시키셨습니까? 나도 고심하고있어. – JMIT

+0

그래, 그게 내가 사용했던 코드 야. CGPDF API가 여전히 작동한다고 가정합니다. – Ismael

답변

1

나는 가정 당신이 PDF 포트폴리오를 참조하십시오

는 다음 각 내부 CGPDFDocumentRef을 구하는 방법에 대한 코드입니다. PDF 포트폴리오의 파일은 기본적으로 확장 속성이있는 문서 첨부 파일이며 EmbeddedFiles 트리에 있습니다. 당신은 문서 카탈로그 사전부터 시작합니다. 문서 카탈로그 사전에서/Names 사전을 검색합니다./Names 사전에서 존재하는 경우 (선택적 임)/EmbeddedFiles 사전을 검색합니다. 파일이 있으면 포함 된 파일 트리의 머리글을 나타냅니다 (PDF 사양의 이름 트리).
PDF 사양 (여기에서 사용 가능 : http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf)은 섹션 7.9.6에서 이름 트리를 설명하며 트리를 구문 분석하는 방법을 알게됩니다.
트리는 문자열 식별자를 파일 지정 사전 (7.11.3 절)에 매핑합니다. 파일 지정 사전에서 임베디드 파일 스트림 인/EF 키 값을 검색합니다 (섹션 7.11.4). 이 객체와 연결된 스트림이 찾고있는 파일 내용입니다.