2010-07-24 13 views
0

je vais faire un lecteur PDF et je suis en train deux solutions possibles:
lecteur PDF avec CGPDFDocumentRef

  • UIWebView
  • CGPDFDocumentRef

Le premier est très simple , mais est plus lent que le second. Pour le second, j'ai trouvé un tutoriel et je peux voir un pdf et je peux le zoomer avec le mouvement à deux doigts. Mais pour le moment, je ne peux pas faire 2 choses:

1) Voir le PDF en mode paysage, en maintenant les bonnes proportions. 2) Effectuez un zoom avant/arrière en appuyant deux fois sur l'écran.

Ces fonctions sont déjà implémentées dans UIWebView, mais comme on l'a déjà dit, c'est un peu lent et ça ouvre tout le document PDF et pas seulement une seule page (donc j'ai besoin de diviser le fichier en une page pdf des dossiers").

Quelqu'un peut-il m'aider avec quelques liens/références/code sur ce genre de problèmes?

+0

Can u s'il vous plaît fournir le lien Tute? –

+0

s'il vous plaît fournir le lien du tutoriel –

Répondre

3

Avec CGPDFDocumentRef, vous devez obtenir chaque page avec CGPDFDocumentGetPage puis obtenir la transformation de dessin avec CGPDFPageGetDrawingTransform et l'appliquer au CGContextRef avant de dessiner la page.

Si vous activez la vue avec votre page PDF dans un UIScrollView, vous pourrez effectuer un zoom avant ou arrière si vous activez le zoom. Vous pouvez également dessiner avec un facteur de zoom à l'aide

CGContextTranslateCTM (context, -sourceRect.origin.x * zoom, -sourceRect.origin.y * zoom); 
    CGContextScaleCTM (context, zoom, zoom); 

Mais vous aurez toujours courir dans la question très complexe pages PDF seront lents à rendre, et chaque fois que vous appelez CGContextDrawPDFPage(context, page); il doit rendre la page entière , comme lorsque vous changez le niveau de zoom. Il y a des façons de contourner cela, comme dessiner dans un CATiledLayer.

+0

Êtes-vous sûr que la page entière sera rendue sur chaque tirage? Le moteur de rendu doit être assez intelligent pour ne pas traiter toutes les données pdf si vous affichez une zone écrêtée, non? – Felixyz

1

Exactement, dans l'exemple que j'ai trouvé, il utilise le CATiledLayer.
Ici il y a mon code:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    CFURLRef pdfURL = CFBundleCopyResourceURL(
               CFBundleGetMainBundle(), 
               CFSTR(filename), 
               CFSTR("pdf"), NULL); 
    myDocumentRef = CGPDFDocumentCreateWithURL(pdfURL); 
    myPageRef = CGPDFDocumentGetPage(myDocumentRef, 1); 
    CGRect pageRect = CGRectMake(0, 0, 320, 480); 

    tiledLayer = [CATiledLayer layer]; 
    tiledLayer.delegate = self; 
    tiledLayer.tileSize = CGSizeMake(1024.0, 1024.0); 
    tiledLayer.levelsOfDetail = 1000; 
    tiledLayer.levelsOfDetailBias = 1000; 
    tiledLayer.frame = pageRect; 

    myContentView = [[UIView alloc] initWithFrame:pageRect]; 
    [myContentView.layer addSublayer:tiledLayer]; 

    CGRect viewFrame = self.view.frame; 
    viewFrame.origin = CGPointZero; 
    scrollView = [[UIScrollView alloc] initWithFrame:viewFrame]; 
    scrollView.delegate = self; 
    scrollView.contentSize = pageRect.size; 
    scrollView.maximumZoomScale = 100; 
    [scrollView addSubview:myContentView]; 

    [self.view addSubview:scrollView]; 
} 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return myContentView; 
} 

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 
{ 
    CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0); 
    CGContextFillRect(ctx, CGContextGetClipBoundingBox(ctx)); 
    CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height); 
    CGContextScaleCTM(ctx, 1.0, -1.0); 
    CGContextConcatCTM(ctx, CGPDFPageGetDrawingTransform(myPageRef, kCGPDFCropBox, layer.bounds, 0, true)); 
    CGContextDrawPDFPage(ctx, myPageRef); 
} 

Cette partie fonctionne très bien, mais si je veux introduire le mode paysage, je dois modifier cette partie:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    if((interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || 
     (interfaceOrientation == UIInterfaceOrientationLandscapeRight)){ 
     //SOMETHING TO DO FOR LANDSCAPE MODE 
    } 
    else if((interfaceOrientation == UIInterfaceOrientationPortrait)){ 
     //SOMETHING TO DO TO RESTORE TO PORTRAIT 
    } 
    // Return YES for supported orientations 
    return ((interfaceOrientation == UIInterfaceOrientationPortrait) || 
      (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || 
      (interfaceOrientation == UIInterfaceOrientationLandscapeRight)); 
} 

J'ai essayé pratically tout, mais Je ne peux pas trouver une bonne solution!

+0

Que diriez-vous de ceci: enregistrez l'orientation, puis lorsque vous dessinez le PDF, si c'est le paysage, utilisez CGContextRotateCTM pour faire pivoter le PDF. – jtbandes

+0

Ok, mais le problème est que si j'appelle CGContextRotateCTM à l'intérieur de la méthode shouldAutorotateToInterfaceOrientation, la transformation ne va pas! Je vois que la seule façon d'appliquer la transformation est de la mettre dans la méthode drawLayer. (Et je ne sais pas je peux le rappeler manuellement) Toute suggestion ou astuce? – Marco

+0

Y at-il un moyen d'afficher toutes les pages, même comme uiwebview.? – Sat

0

vous pouvez appeler dessiner la méthode de la couche d'une couche manuellement en disant [yourLayer setNeedsDisplay]