2011-09-30 27 views
54

Tôi đang cố gắng vẽ nội dung của scrollview vào một ngữ cảnh PDF & Tôi đang gặp sự cố với pagination.Vẽ Contex + Phân trang

Tiếp theo Mã Tôi đã sử dụng:

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

Nó tạo ra số lượng yêu cầu của trang nhưng đặt nội dung sai. Hình sau giải thích nó. enter image description here

Có điều gì sai trong mã của tôi không?

+0

không may mắn với điều này? – Magnus

+0

Tò mò về cách mọi thứ hoạt động nếu bạn chọn chế độ xem phụ của mình trong ScrollView? – bentford

+0

Các phần u cần thêm vào các trang pdf đặt trong các khung nhìn riêng biệt bên trong cuộn và hiển thị chế độ xem theo ngữ cảnh pdf –

Trả lời

1

Tôi không nghĩ bạn cần mã lật ngược PDF. Tôi đã thực hiện điều này trước đây (phân trang thủ công, nhưng không có chế độ xem cuộn) và không bao giờ phải lật ngữ cảnh theo chiều dọc. Mối quan tâm chính của tôi là bạn đang làm nó trên mỗi lần lặp lại - nếu bạn có một lý do hợp lệ để lật nó, bạn có thể không cần nó trong vòng lặp, nhưng chỉ một lần trước khi vòng lặp bắt đầu. Ngoài ra mã CGContextTranslateCTM(pdfContext,0,-ty); có thể cần phải được thay thế bằng CGContextTranslateCTM(pdfContext,0,heightOfPdf);

Nếu điều đó không làm việc, hãy thử UIGraphicsBeginPDFPage(); thay vì CGContextBeginPage(), đó là sự khác biệt lớn duy nhất giữa mã của bạn và của tôi.

1

Tìm thấy liên kết này để hiển thị tệp PDF, nó nói về nhiều trang nhưng chưa hiển thị triển khai. Nó không ngay lập tức trả lời cho câu hỏi của bạn, nhưng nó nói với một phương pháp đơn giản hơn để kết xuất một bản pdf với ít dịch và biến đổi hơn nhiều.

Render PDF

Generate Multipage PDF -anoop

1

Các phần bạn cần để thêm vào các trang pdf đưa vào quan điểm riêng biệt bên trong cuộn và render xem THT với bối cảnh pdf

HOẶC

Chỉ cần tìm kích thước chính xác và vẽ bằng phương pháp 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]; 

Có rất nhiều phương pháp vẽ để vẽ pdf. Bạn có thể sử dụng nó để vẽ tất cả các nội dung.

1

This dự án github chắc chắn có thể giúp bạn.

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

Có thể thay đổi phông chữ và phông chữ của pdf trong khi được thêm vào ngữ cảnh không? ... Hoặc có cách nào khác để thay đổi phông chữ hoặc kích thước phông chữ trong pdf không? .. – iSeeker

0

điều này có thể giúp bạn.

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

Và sự khác biệt từ nhận xét của Rakesh là gì ? – kpower

1

Bạn có thể xem xét sử dụng UIScrollView để bố trí các trang PDF riêng biệt của mình. Các phương pháp sau đây tải mỗi trang PDF trong một lần xem (PDFView) và thêm nó vào nội dung xem di chuyển trong một thời trang làm trung tâm:

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

Trong trường hợp này, PDFView chịu trách nhiệm vẽ một đơn CGPDFPageRef trong drawRect hoặc drawLayer của nó thực hiện.