2011-09-30 16 views
54

Sto cercando di disegnare il contenuto di scrollview in un contesto PDF & Sono di fronte a un problema con pagination.Disegno Contex + impaginazione

seguente codice che ho usato:

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

Crea numero di pagine, ma pone il contenuto errato. La seguente figura lo spiega. enter image description here

C'è qualcosa di sbagliato nel mio codice?

+0

no fortuna con questo? – Magnus

+0

Sei curioso di sapere come funzionano le cose se togli la sottomenu dalla ScrollView? – bentford

+0

Le porzioni da aggiungere alle pagine pdf inserite in viste separate all'interno dello scroll e renderizzare la vista al contesto pdf –

risposta

1

Non penso che sia necessario il codice che capovolge il PDF. L'ho fatto prima (impaginazione manuale, ma senza una vista di scorrimento) e non ho mai dovuto capovolgere verticalmente il contesto. La mia preoccupazione principale è che lo stai facendo ad ogni iterazione: se hai un motivo valido per lanciarlo, probabilmente non ne hai bisogno nel ciclo, ma solo una volta prima che inizi il ciclo. Anche il codice CGContextTranslateCTM(pdfContext,0,-ty); potrebbe aver bisogno di essere sostituito con CGContextTranslateCTM(pdfContext,0,heightOfPdf);

Se questo non funziona, provare UIGraphicsBeginPDFPage(); invece di CGContextBeginPage(), questa è l'unica grande differenza tra il codice e il mio.

1

Trovato questo collegamento per il rendering di un PDF, si dice su più pagine ma non ha mostrato un'implementazione. Non risponde immediatamente alla tua domanda, ma indica un metodo più semplice per rendere un pdf con molto meno traduzioni e trasformazioni.

Render PDF

Generate Multipage PDF -anoop

1

Le porzioni è necessario aggiungere alle pagine pdf messo in viste separate all'interno del rotolo e rendere vista tht al contesto pdf

O

Basta trovare le dimensioni corrette e disegnare utilizzando il metodo 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]; 

Ci sono molti metodi di disegno per disegnare pdf. Puoi usarlo per disegnare tutti i contenuti.

1

This Il progetto github può sicuramente aiutarti.

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

}

+0

È possibile modificare il carattere e il carattere del pdf mentre viene aggiunto al contesto? ... O ci sono altri modi per cambiare il carattere o la dimensione del carattere in un pdf? .. – iSeeker

0

Questo potrebbe aiutare.

- (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); 
} 
+1

E qual è la differenza dal commento di Rakesh? ? – kpower

1

Si potrebbe considerare l'utilizzo di un UIScrollView al layout delle pagine PDF separati. Il metodo seguente carica ogni pagina PDF in una vista (PDFView) e lo aggiunge al contenuto di vista di scorrimento in modo centrato:

- (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)]; 
} 

In questo caso, PDFView è responsabile per il rendering di un singolo CGPDFPageRef nella sua drawRect o drawLayer implementazione.