2011-09-30 66 views
54

我想畫的scrollview內容爲PDF方面&我與pagination面臨的問題。我已經使用Contex的圖紙+分頁

下面的代碼:

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

它創建所需數量的頁面,但內容錯誤的地方。下圖解釋了它。 enter image description here

我的代碼有什麼問題嗎?

+0

這次沒有運氣? – Magnus

+0

如果您將子視圖從ScrollView移出,好奇的事情是如何工作的? – bentford

+0

您需要添加到PDF頁面的部分放在滾動內部的獨立視圖,並呈現PDF上下文的視圖 –

回答

1

我不認爲你需要顛倒PDF翻轉的代碼。我以前做過這個(手動分頁,但沒有滾動視圖),並且從不需要垂直翻轉上下文。我主要關心的是,你在每一次迭代中都這樣做 - 如果你有一個合理的翻轉原因,你可能不需要它在循環中,而只是在循環開始之前。另外,代碼CGContextTranslateCTM(pdfContext,0,-ty);可能需要與CGContextTranslateCTM(pdfContext,0,heightOfPdf);

被替換。如果不行,請嘗試UIGraphicsBeginPDFPage();而不是CGContextBeginPage(),這是你的代碼和我之間的唯一的主要區別。

1

找到這個鏈接來渲染PDF,它說了多個頁面,但沒有顯示實現。它不會馬上回答你的問題,但它告訴一個更簡單的方法來使用更少的翻譯和變換來呈現PDF。

Render PDF

Generate Multipage PDF -anoop

1

需要謂視圖添加到PDF頁面放在滾動內的獨立意見,並呈現到PDP上下文

OR

的部分只需找到正確的尺寸並使用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]; 

有很多繪製方法來繪製pdf。您可以使用它來繪製所有內容。

1

This github項目絕對可以幫到你。

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

有沒有可能在添加到上下文中時更改pdf的字體和字體大小......或者還有其他方法可以更改pdf中的字體或字體大小嗎.. – iSeeker

0

這可能會幫助你。

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

與Rakesh的評論有何區別? – kpower

1

您可以考慮使用UIScrollView來設計您的單獨PDF頁面。以下的方法加載每個PDF頁面中的視圖(PDFView),並將其添加到滾動視圖內容以居中的方式:

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

在這種情況下,PDFView負責其的drawRect或drawLayer渲染單個CGPDFPageRef實現。