2014-01-29 2 views
1

내 응용 프로그램에서 많은 PDF 파일을로드합니다.이 시트는로드하는 데 시간이 오래 걸립니다 (iPad 2, iOS 7에서는 10 초 +). 그러면 별도의 시트로드가 가능해졌습니다. 파일 디렉토리는, 아래 applicationDidFinishLaunching()에서 - 나는 다음 사용자 디렉토리에있는 파일을 참조 할 수 그들은 빠르게로드합니다 -하지만 그것은 전혀 차이iOS 지연 PDF로드 중

다음

내의 drawRect() 메소드는 PDF

표시에 대한 책임을하지
CGContextRef ctx = UIGraphicsGetCurrentContext(); 
//PDF might be transparent, assume white paper - set White Background 
[[UIColor whiteColor] set]; 
CGContextFillRect(ctx, rect); 

//PDF File Path 
//"pdf" refers to the location in the directory where the file is saved" 
CGPDFPageRef page1 = CGPDFDocumentGetPage(pdf, 1); 

//Flip coordinates 
CGContextGetCTM(ctx); 
CGContextScaleCTM(ctx, 1, -1); 
CGContextTranslateCTM(ctx, 0, -rect.size.height); 

//Get the rectangle of the cropped inside 
CGRect mediaRect = CGPDFPageGetBoxRect(page1, kCGPDFCropBox); 

CGContextScaleCTM(ctx, rect.size.width/mediaRect.size.width, 
        rect.size.height/mediaRect.size.height); 

//Draw PDF 
CGContextDrawPDFPage(ctx, page1); 
CGPDFDocumentRelease(pdf); 

idInit() 메소드에서 선언 된 파일 위치의 디렉토리

NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); 
    NSString *documentDirectory = [documentDirectories objectAtIndex:0]; 
    NSString *dataPath = [documentDirectory stringByAppendingPathComponent: 
          [NSString stringWithFormat:@"PDFSource"]]; 
    NSString *documentDirectoryFilename = [dataPath stringByAppendingPathComponent: 
              [NSString stringWithFormat:@"BUEvenous.pdf"]]; 

    CFStringRef path = CFStringCreateWithCString (NULL, [documentDirectoryFilename UTF8String], kCFStringEncodingUTF8); 
    CFURLRef url = CFURLCreateWithFileSystemPath (NULL, path, kCFURLPOSIXPathStyle, 0); 
    CFRelease (path); 
    pdf = CGPDFDocumentCreateWithURL(url);// 2 
    CFRelease(url); 

당신의 도움이 지침, 제안은, 어떤 점은 내가 더 빨리이 부하를 만들 수있는 방법의 잘못된거야 곳으로 대단히 감사합니다

편집

@DavidvanDriessche은 주셔서 감사합니다 제안, 그것은 내가 사용하고있는 PDF 파일이 실제로 꽤 큽니다 (약 1MB), 테스트에서 배운 것은 PDF 파일을 더 압축하면 = < 500kbs가 아니라는 것입니다. 로딩 시간 문제 - 파일을 압축하면 포함 된 일부 이미지에서 이미지 품질이 떨어집니다. PDF : 또한 iPad 2 일 수도 있습니다 - 새로운 장치에서 실행하여이 게시물에 추가하려고합니다.

다른 제안 사항이 있습니까?

작업

+1

모든 PDF 파일에서 발생합니까 아니면 특정 파일에서만 볼 수있는 것입니까? PDF의 일부 기능은 다른 기능보다 훨씬 비쌉니다. 예는 벡터 요소가 많고 클리핑이 계속되는 복잡한 페이지와 JPEG-2000 인코딩 이미지로 구성되어 있습니다. 그 중에서도 오래된 장치 (예 : iPad 2)의 상당수는 메모리가 매우 제한되어 있고 무거운 파일을 처리하는 데 프로세서가 매우 느립니다. 그러나 PDF가 무엇인지 먼저 확인하십시오. 차이점을 확인하기 위해 매우 간단한 PDF 파일로 시도하십시오. –

+0

@DavidvanDriessche 질문에 대한 편집으로 답변을 추가 할 것이라고 생각했는데 비슷한 문제를 해결하는 데 도움이 될 수 있습니다. –

답변

2

대신 PDF 페이지의 이미지를 만드는 것을 고려하고 NSOperation를 통해 또는 PDF 페이지에서 이미지를 만들려면

dispatch_async를 사용하여 백그라운드 스레드에서 그렇게 할 수 있습니다 :

+(UIImage *)getPDFPage:(CGPDFPageRef) page rect:(CGRect) rect 
{ 

    CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox); 


    UIGraphicsBeginImageContext(pageRect.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextTranslateCTM(context, 0.0, pageRect.size.height); 

    CGContextScaleCTM(context, 1.0, -1.0); 

    CGContextDrawPDFPage(context, page); 

    UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 
    return img; 
} 

편집 :

이 코드는 PDF 파일 (위 코드의 pageRect)에 의해 결정된 크기의 이미지. 줌 레벨은 사용 가능한 미디어에 따라 결정됩니다. CGPDFPageGetBoxRecthere의 다른 값을 살펴보십시오.

이미지가 많은 메모리를 차지할 수 있습니다. 다음을 사용하여 이미지를 디스크에 저장할 수 있습니다.

NSData *imageData = UIImagePNGRepresentation(pdfImage); 

그런 다음 필요한 경우 관련 페이지를로드하십시오. iUnit 디스크에서 이미지를로드하는 것은 꽤 빠릅니다.

+0

감사합니다. Esben,이 작업을 수행 할 수는 있지만 내 애플리케이션보다 PDF 파일로 작업 할 때 큰 이점 인 무손실 줌을 잃을 것입니다 - 맞습니까? –

+0

@ TaskinulHaque 방금 추가 정보로 답변을 업데이트했습니다. 행운과 행복 코딩! – EsbenB