Lecteur de Pdf

ettiboettibo Membre
06:05 modifié dans Vos applications #1
Bonjour, je suis débutant en programmation sur iPhone, et j'essaye de faire un programme qui permet de lister les pdf présent sur un Ipad, les afficher dans un carroussel et quand on clic dessus, que les pdf s'ouvre.
J'ai testé d'ouvrir un pdf dans une view, mais sans succès, voici mon code:
-(void)openMyPdf:(NSString *)file<br />{<br />&nbsp; &nbsp; NSString *filePath = [[NSBundle mainBundle] pathForResource:file ofType:@&quot;pdf&quot; inDirectory:@&quot;PDFDemoExport&quot;];<br />&nbsp; &nbsp; NSData *pdfData = [NSData dataWithContentsOfFile:filePath];<br />&nbsp; &nbsp; NSLog(@&quot;PATH: %@&quot;, filePath);<br />	if (pdfData) {<br />&nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;ici&quot;);<br />&nbsp; &nbsp; &nbsp; &nbsp; CFURLRef myPdf = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)filePath, kCFURLPOSIXPathStyle, NO);<br />&nbsp; &nbsp; &nbsp; &nbsp; CGPDFDocumentRef document = CGPDFDocumentCreateWithURL(myPdf);<br />&nbsp; &nbsp; &nbsp; &nbsp; if (document != NULL)<br />&nbsp; &nbsp; &nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextRef myContext = UIGraphicsGetCurrentContext();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGPDFPageRef page = CGPDFDocumentGetPage(document, 1);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextDrawPDFPage(myContext, page);<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }<br />}<br />

Quand je vais sur ma view, celle-ci est blanche, des idées?
Merci d'avance

Réponses

  • BunoBuno Membre
    06:05 modifié #2
    Hello,
    Tu peux passer par une UIWebView, non?
  • ettiboettibo Membre
    06:05 modifié #3
    Justement, je voudrais vraiment éviter
  • LarmeLarme Membre
    06:05 modifié #4
    Case présentation ?
  • CeetixCeetix Membre
    06:05 modifié #5
    Débutant en programmation iPhone et tu commences par ça et avec un carrousel ?
    PAsse par une UIWebView plutôt ;)

    +1 pour Larme.
  • Eric P.Eric P. Membre
    06:05 modifié #6
    Bonjour,

    Avant le DrawPDFPage ajoute :
    <br />&nbsp; &nbsp; &nbsp; &nbsp; CGRect mediaRect = CGPDFPageGetBoxRect(page, kCGPDFCropBox);<br />&nbsp; &nbsp; &nbsp; &nbsp; CGContextTranslateCTM(myContext, 0.0, mediaRect.size.height);<br />&nbsp; &nbsp; &nbsp; &nbsp; CGContextTranslateCTM(myContext, 0.0, 0.0);<br />&nbsp; &nbsp; &nbsp; &nbsp; CGContextScaleCTM(myContext, 1.0 , -1.0);<br />
    


    pour dessiner le pdf depuis le coin haut/gauche et dans le sens normal.
  • ettiboettibo Membre
    06:05 modifié #7
    Bonjour Eric P,
    j'ai mis les lignes suivantes dans le code:
    CGRect mediaRect = CGPDFPageGetBoxRect(page, kCGPDFCropBox);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextTranslateCTM(myContext, 0.0, mediaRect.size.height);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextTranslateCTM(myContext, 0.0, 0.0);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextScaleCTM(myContext, 1.0 , -1.0);
    


    et quand je lance l'application, la console me donne ceci: Jul 20 10:20:13 Ipad1-VM SympoBrilique[7394] <Error>: CGContextTranslateCTM: invalid context 0x0
    Jul 20 10:20:13 Ipad1-VM SympoBrilique[7394] <Error>: CGContextTranslateCTM: invalid context 0x0
    Jul 20 10:20:13 Ipad1-VM SympoBrilique[7394] <Error>: CGContextScaleCTM: invalid context 0x0


    de ce que je comprends, c'est mon contexte qui est invalide, ya t-il une autre méthode que UIGraphicsGetCurrentContext();?
    Merci d'avance
  • Eric P.Eric P. Membre
    06:05 modifié #8
    Mon code exact pour afficher des pdf est le suivant :
    <br />&nbsp; &nbsp; &nbsp; &nbsp; CGContextSaveGState(contex);<br />&nbsp; &nbsp; &nbsp; &nbsp; CGPDFPageRef page1 = CGPDFDocumentGetPage(mPdf, 1);<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; CGContextTranslateCTM(contex, 0.0, (y2 - y1) * zoomFactor);<br />&nbsp; &nbsp; &nbsp; &nbsp; CGContextTranslateCTM(contex, (x1 - delta_x) * zoomFactor, (y1 - delta_y) * zoomFactor);<br />&nbsp; &nbsp; &nbsp; &nbsp; CGContextScaleCTM(contex, 1.0 * zoomFactor, -1.0 * zoomFactor);<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; CGContextDrawPDFPage(contex, page1);<br />&nbsp; &nbsp; &nbsp; &nbsp; CGContextRestoreGState(contex);<br />
    


    avec : (CGContextRef)contex passé en paramètre
    X1, x2, y1, Y2 sont les coordonnées de mon objet "Picture" qui peut être un pdf ou une bitmap.

    Je l'ai juste adapté pour ton cas.

    Peux-tu poster toute ta routine "openMyPdf " de dessin du pdf ?
  • ettiboettibo Membre
    juillet 2011 modifié #9
    Par routine, tu veux dire méthode?
    -(void)openMyPdf:(NSString *)file<br />{<br />&nbsp; &nbsp; NSString *filePath = [[NSBundle mainBundle] pathForResource:file ofType:@&quot;pdf&quot; inDirectory:@&quot;PDFDemoExport&quot;];<br />&nbsp; &nbsp; NSData *pdfData = [NSData dataWithContentsOfFile:filePath];<br />&nbsp; &nbsp; NSLog(@&quot;PATH: %@&quot;, filePath);<br />	if (pdfData) {<br />&nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;ici&quot;);<br />&nbsp; &nbsp; &nbsp; &nbsp; CFURLRef myPdf = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)filePath, kCFURLPOSIXPathStyle, NO);<br />&nbsp; &nbsp; &nbsp; &nbsp; CGPDFDocumentRef document = CGPDFDocumentCreateWithURL(myPdf);<br />&nbsp; &nbsp; &nbsp; &nbsp; if (document != NULL)<br />&nbsp; &nbsp; &nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGPDFPageRef page = CGPDFDocumentGetPage(document, 1);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGRect mediaRect = CGPDFPageGetBoxRect(page, kCGPDFCropBox);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextRef myContext = UIGraphicsGetCurrentContext();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (myContext == NULL)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;plip&quot;);<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextTranslateCTM(myContext, 0.0, mediaRect.size.height);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextTranslateCTM(myContext, 0.0, 0.0);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextScaleCTM(myContext, 1.0 , -1.0);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextDrawPDFPage(myContext, page);<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }<br />}
    


    Et bien sur, j'ai le plip qui s'affiche, je tiens à  signaler que je suis dans un UIViewController, si ça peut aider pour l'orientation du problème
  • Eric P.Eric P. Membre
    06:05 modifié #10
    C'est sûr que si "plip" s'affiche...

    Il serait plus sage d'écrire :
    <br />if (myContext == NULL) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;plip&quot;);<br />} else {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextTranslateCTM(myContext, 0.0, mediaRect.size.height);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextTranslateCTM(myContext, 0.0, 0.0);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextScaleCTM(myContext, 1.0 , -1.0);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextDrawPDFPage(myContext, page);<br />}<br />
    


    d'après la doc. :
    UIGraphicsGetCurrentContext
    Returns the current graphics context.

    CGContextRef UIGraphicsGetCurrentContext (
      void
    );
    Return Value
    The current graphics context.

    Discussion
    The current graphics context is nil by default. Prior to calling its drawRect: method, view objects push a valid context onto the stack, making it current. If you are not using a UIView object to do your drawing, however, you must push a valid context onto the stack manually using the UIGraphicsPushContext function.

    You should call this function from the main thread of your application only.

    Tout est dit, il me semble...
  • ettiboettibo Membre
    juillet 2011 modifié #11
    J'avais fait un Push, l'erreur était la même sauf que l'adresse n'était plus nul.
    Il ne faudrait pas que je "push" dans la view et non pas dans le viewController?
    -(void)openMyPdf:(NSString *)file<br />{<br />&nbsp; &nbsp; NSString *filePath = [[NSBundle mainBundle] pathForResource:file ofType:@&quot;pdf&quot; inDirectory:@&quot;PDFDemoExport&quot;];<br />&nbsp; &nbsp; NSData *pdfData = [NSData dataWithContentsOfFile:filePath];<br />&nbsp; &nbsp; NSLog(@&quot;PATH: %@&quot;, filePath);<br />	if (pdfData) {<br />&nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;ici&quot;);<br />&nbsp; &nbsp; &nbsp; &nbsp; CFURLRef myPdf = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)filePath, kCFURLPOSIXPathStyle, NO);<br />&nbsp; &nbsp; &nbsp; &nbsp; CGPDFDocumentRef document = CGPDFDocumentCreateWithURL(myPdf);<br />&nbsp; &nbsp; &nbsp; &nbsp; if (document != NULL)<br />&nbsp; &nbsp; &nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextRef testContext;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UIGraphicsPushContext(testContext);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextRef myContext = UIGraphicsGetCurrentContext();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (myContext == NULL)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;plip&quot;);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGPDFPageRef page = CGPDFDocumentGetPage(document, 1);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGRect mediaRect = CGPDFPageGetBoxRect(page, kCGPDFCropBox);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextTranslateCTM(myContext, 0.0, mediaRect.size.height);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextTranslateCTM(myContext, 0.0, 0.0);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextScaleCTM(myContext, 1.0 , -1.0);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextDrawPDFPage(myContext, page);<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }<br />}
    
  • Eric P.Eric P. Membre
    06:05 modifié #12
    Les UIView ont une méthode drawRect qui sert à  dessiner son contenu.
    Il faut passer par cette méthode quitte à  forcer son appel avec (UIView setNeedsDisplay).
    Il faut plutôt ouvrir le pdf dans la procédure openMyPdf puis appeler (UIView drawRect) avec (UIView setNeedsDisplay) pour dessiner.
  • ettiboettibo Membre
    06:05 modifié #13
    Quitte à  passer pour un mec qui ne comprends rien, je vais te demander de l'adapter pour mon code (si cela ne te dérange pas bien-sur), car je comprends le principe, mais pour moi, le context va rester null même si tu fais ça, et j'ai implémenté ce que j'ai compris de ton explication et ça donne ceci:
    -(void)openMyPdf:(NSString *)file<br />{<br />&nbsp; &nbsp; NSString *filePath = [[NSBundle mainBundle] pathForResource:file ofType:@&quot;pdf&quot; inDirectory:@&quot;PDFDemoExport&quot;];<br />&nbsp; &nbsp; NSData *pdfData = [NSData dataWithContentsOfFile:filePath];<br />	if (pdfData) {<br />&nbsp; &nbsp; &nbsp; &nbsp; CFURLRef myPdf = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)filePath, kCFURLPOSIXPathStyle, NO);<br />&nbsp; &nbsp; &nbsp; &nbsp; CGPDFDocumentRef document = CGPDFDocumentCreateWithURL(myPdf);<br />&nbsp; &nbsp; &nbsp; &nbsp; if (document != NULL)<br />&nbsp; &nbsp; &nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGPDFPageRef page = CGPDFDocumentGetPage(document, 1);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGRect mediaRect = CGPDFPageGetBoxRect(page, kCGPDFCropBox);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [self.view drawRect:mediaRect];<br />&nbsp; &nbsp; &nbsp; &nbsp;  <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [self.view setNeedsDisplay];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextRef myContext = UIGraphicsGetCurrentContext();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (myContext == NULL)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;plip&quot;);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextTranslateCTM(myContext, 0.0, mediaRect.size.height);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextTranslateCTM(myContext, 0.0, 0.0);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextScaleCTM(myContext, 1.0 , -1.0);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CGContextDrawPDFPage(myContext, page);<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }<br />}
    


    et donc, le context est toujours invalide
  • Eric P.Eric P. Membre
    06:05 modifié #14
    Désolé mais je n'avais pas noté que ton code n'était ni dans l'UIView ni dans drawRect.
    L'UIView sert à  afficher le pdf.
    L'UIViewController possède un mécanisme de choix du pdf.
    Dans openMypdf, tu récupères le pdf et tu indiques à  l'UIView qu'elle doit se redessiner avec : [self.view set Needsdisplay]
    Puis tu dessines dans la méthode drawRect de l'UIView ou depuis cette méthode.
  • ettiboettibo Membre
    06:05 modifié #15
    Petite question, n'aurais-je pas intérêt à  surcharger la méthode drawRect de la UIVIew?
  • Eric P.Eric P. Membre
    06:05 modifié #16
    Regardes les exemples "SimpleTiledScrollExample" et "ZoomingPDFViewer".
    La différence est qu'il utilise des layers donc le dessin est placé dans drawLayer au lieu de drawRect.
Connectez-vous ou Inscrivez-vous pour répondre.