54 votes

Dessin Contex + Pagination

J'essaie de dessiner des contenus de scrollview dans un contexte PDF & je suis confronté à un problème avec pagination .

Code suivant que j'ai utilisé:

 - (void)renderTheView:(UIView *)view inPDFContext:(CGContextRef)pdfContext
{
    // Creating frame.
    CGFloat heightOfPdf = [[[self attributes] objectForKey:SRCPdfHeight] floatValue];
    CGFloat widthOfPdf  = [[[self attributes] 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 requis de pages mais place le contenu à tort. La figure suivante l'explique. entrez la description de l'image ici

Y at-il quelque chose de mal dans mon code?

1voto

jverrijt Points 392

Vous pouvez 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 défilante de manière centrée:

 - (void) loadPDFAtPath:(NSString *)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.

1voto

zerotool Points 475

Je ne pense pas que vous avez besoin du code qui retourne le fichier PDF à l'envers. Je l'ai fait avant (manuel pagination, mais sans défilement de l'affichage) et n'a jamais eu à inverser le contexte verticalement. Ma principale préoccupation est que vous le faites à chaque itération - si vous avez une raison valable pour en le feuilletant, vous n'avez probablement pas besoin dans la boucle, mais juste une fois avant la boucle commence. Aussi le code CGContextTranslateCTM(pdfContext,0,-ty); peut-être besoin d'être remplacé par CGContextTranslateCTM(pdfContext,0,heightOfPdf);

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

1voto

anoop4real Points 449

Trouvé ce lien pour rendre un PDF, il dit à propos de plusieurs pages, mais n'a pas montré d'implémentation. Il ne répond pas tout de suite à votre question, mais il indique une méthode plus simple pour rendre un fichier PDF avec beaucoup moins de traduction et de transformation.

Rendu PDF

Générer un PDF multipage -anoop

1voto

Lithu T.V Points 10117

Les portions que vous devez ajouter aux pages pdf sont placées dans des vues séparées à l’intérieur du défilement et rendues la vue au contexte pdf

OU

Il suffit de trouver les bonnes dimensions et de dessiner 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 y a beaucoup de méthodes de dessin pour dessiner pdf. Vous pouvez l'utiliser pour dessiner tout le contenu.

1voto

Rakesh Points 1285

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);
 

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X