Dessin Contex + Pagination

J’essaie de dessiner le contenu de scrollview dans un contexte PDF et je suis confronté à un problème de pagination .

Suivant le code que j’ai utilisé:

 - (void)renderTheView:(UIView *)view inPDFContext:(CGContextRef)pdfContext { // Creating frame. CGFloat heightOfPdf = [[[self atsortingbutes] objectForKey:SRCPdfHeight] floatValue]; CGFloat widthOfPdf = [[[self atsortingbutes] objectForKey:SRCPdfWidth] floatValue]; CGRect pdfFrame = CGRectMake(0, 0, widthOfPdf, heightOfPdf); CGRect viewFrame = [view frame]; if ([view isKindOfClass:[UIScrollView class]]) { viewFrame.size.height = ((UIScrollView *)view).contentSize.height; [view setFrame:viewFrame]; } // Calculates number of pages. NSUInteger totalNumberOfPages = ceil(viewFrame.size.height/heightOfPdf); // Start rendering. for (NSUInteger pageNumber = 0; pageNumber<totalNumberOfPages; pageNumber++) { // Starts our first page. CGContextBeginPage (pdfContext, &pdfFrame); // Turn PDF upsidedown CGAffineTransform transform = CGAffineTransformIdentity; transform = CGAffineTransformMakeTranslation(0,view.bounds.size.height); transform = CGAffineTransformScale(transform, 1.0, -1.0); CGContextConcatCTM(pdfContext, transform); // Calculate amount of y to be displace. CGFloat ty = (heightOfPdf*(pageNumber)); CGContextTranslateCTM(pdfContext,0,-ty); [view.layer renderInContext:pdfContext]; // We are done drawing to this page, let's end it. CGContextEndPage (pdfContext); } } 

Il crée le nombre requirejs de pages mais place le contenu à tort. La figure suivante l’explique. entrer la description de l'image ici

Y a-t-il quelque chose qui ne va pas dans mon code?

    Je ne pense pas que vous ayez besoin du code qui retourne le PDF à l’envers. Je l’ai déjà fait (pagination manuelle, mais sans vue défilement) et je n’ai jamais eu à retourner le contexte verticalement. Ma principale préoccupation est que vous le faites à chaque itération – si vous avez une raison valable pour la retourner, vous n’en avez probablement pas besoin dans la boucle, mais juste une fois avant le début de la boucle. Aussi le code CGContextTranslateCTM(pdfContext,0,-ty); pourrait avoir besoin d’être remplacé par CGContextTranslateCTM(pdfContext,0,heightOfPdf);

    Si cela ne fonctionne pas, essayez UIGraphicsBeginPDFPage(); au lieu de CGContextBeginPage() , c’est la seule différence majeure entre votre code et le mien.

    Ce projet github peut certainement vous aider.

     - (void) renderPageAtIndex:(NSUInteger)index inContext:(CGContextRef)ctx { CGPDFPageRef page = CGPDFDocumentGetPage(pdf, index + 1); CGAffineTransform transform = aspectFit(CGPDFPageGetBoxRect(page, kCGPDFMediaBox), CGContextGetClipBoundingBox(ctx)); CGContextConcatCTM(ctx, transform); CGContextDrawPDFPage(ctx, page); 

    }

    J’ai trouvé ce lien pour rendre un PDF, il est dit sur plusieurs pages mais n’a pas montré d’implémentation. Il ne répond pas immédiatement à votre question, mais il vous propose une méthode plus simple pour rendre un pdf avec beaucoup moins de traduction et de transformations.

    Render PDF

    Générer un PDF Multipage -anoop

    Vous pourriez envisager d’utiliser un UIScrollView pour mettre en page vos pages PDF séparées. La méthode suivante charge chaque page PDF dans une vue ( PDFView ) et l’ajoute au contenu de la vue de défilement de manière centrée:

     - (void) loadPDFAtPath:(NSSsortingng *)path { NSURL *pdfUrl = [NSURL fileURLWithPath:path]; CGPDFDocumentRef document = CGPDFDocumentCreateWithURL((__bridge CFURLRef)pdfUrl); float height = 0.0; for(int i = 0; i < CGPDFDocumentGetNumberOfPages(document); i++) { CGPDFPageRef page = CGPDFDocumentGetPage(document, i + 1); PDFView *pdfView = [[PDFView alloc] initPdfViewWithPageRef:page]; CGRect pageSize = CGPDFPageGetBoxRect(page, kCGPDFCropBox); pv.frame = CGRectMake((self.frame.size.width / 2.0) - pageSize.size.width / 2.0, height, pageSize.size.width, pageSize.size.height); height += pageSize.size.height + SOME_SPACE_IN_BETWEEN_PAGES; // self is a subclass of UIScrollView [self addSubview:pdfView]; [pdfView setNeedsDisplay]; } CGPDFDocumentRelease(document); [self setContentSize:CGSizeMake(self.frame.size.width, height)]; } 

    Dans ce cas, PDFView est responsable du rendu d'un seul CGPDFPageRef dans son implémentation drawRect ou drawLayer.

    Les parties que vous devez append aux pages pdf placent des vues séparées dans le défilement et les rendent au contexte pdf

    OU

    Trouvez simplement les bonnes dimensions et dessinez en utilisant la méthode CG:

      UIImage *Logo=[UIImage imageNamed:@"small-logo-left-top130_133.png"]; CGPoint drawingLogoOrgin = CGPointMake(5,5); UIGraphicsBeginPDFContextToData(pdfData, CGRectZero, nil); UIGraphicsBeginPDFPageWithInfo(pageFrame, nil); CGContextRef pdfContext = UIGraphicsGetCurrentContext(); [Logo drawAtPoint:drawingLogoOrgin]; 

    Il existe de nombreuses méthodes de dessin pour dessiner des pdf. Vous pouvez l’utiliser pour dessiner tout le contenu.

    cela pourrait vous aider.

     - (void) renderPageAtIndex:(NSUInteger)index inContext:(CGContextRef)ctx { CGPDFPageRef page = CGPDFDocumentGetPage(pdf, index + 1); CGAffineTransform transform = aspectFit(CGPDFPageGetBoxRect(page, kCGPDFMediaBox), CGContextGetClipBoundingBox(ctx)); CGContextConcatCTM(ctx, transform); CGContextDrawPDFPage(ctx, page); }