2011-07-25 3 views
0

Je développe une application qui rend un fichier PDF en utilisant CoreGraphics. J'affiche une page du PDF à la fois. Dans viewDidLoad Je le code suivant:Chargement d'un fichier PDF sur l'iPad est beaucoup trop lent

NSString *pdfFullPath = [[NSBundle mainBundle] pathForResource:@"catalogue" ofType:@"pdf"]; 
pdf = CGPDFDocumentCreateWithURL((__bridge CFURLRef)[NSURL fileURLWithPath:pdfFullPath]); 

currentPage = [[_dataObject description] intValue]; 

[pdfView setImage:[self imageFromPDF:pdf withPageNumber:currentPage withScale:1.5]]; 

[_dataObject description] contient le numéro de page en tant que chaîne.

Je cette méthode qui rend le PDF:

- (UIImage *)imageFromPDF:(CGPDFDocumentRef)_pdf withPageNumber:(NSUInteger)pageNumber withScale:(CGFloat)scale 
{ 
    if(pageNumber > 0 && pageNumber <= CGPDFDocumentGetNumberOfPages(_pdf)) 
    { 
     CGPDFPageRef pdfPage = CGPDFDocumentGetPage(_pdf, pageNumber); 
     CGRect tmpRect = CGPDFPageGetBoxRect(pdfPage,kCGPDFMediaBox); 
     CGRect rect = CGRectMake(tmpRect.origin.x, tmpRect.origin.y, tmpRect.size.width * scale, tmpRect.size.height * scale); 
     UIGraphicsBeginImageContext(rect.size); 
     CGContextRef context = UIGraphicsGetCurrentContext(); 
     CGContextTranslateCTM(context, 0, rect.size.height); 
     CGContextScaleCTM(context, scale, -scale); 
     CGContextDrawPDFPage(context, pdfPage); 
     UIImage *pdfImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

     return pdfImage; 
    } 

    return nil; 
} 

Cela semble être un processus très lent qui bloque l'application entièrement lorsque imageFromPDF est appelé et donc je cherche une façon d'optimiser la processus donc ce serait plus rapide. Des idées?

Répondre

0

Ce que j'ai fini par faire est de sauvegarder chaque page du PDF comme une image sur l'iPad. Le nom des images est le numéro de page. Lorsque je passe à une nouvelle page, je vérifie si le fichier existe sur l'iPad. Par exemple. pour la page 4 je vérifierais si "4.jpg" existe, si c'est le cas, je montrerai "4.jpg" sinon je rendrai la page et la sauvegarderai. Cette approche peut utiliser beaucoup d'espace sur l'iPad mais pour mon utilisation ce n'est pas vraiment un problème car l'application ne finira pas sur App Store mais sera utilisée pour les vendeurs dans une entreprise.