Contex Drawing + Pagination

时间:2011-09-30 07:21:52

标签: iphone ios pdf quartz-2d cgcontext

我正在尝试将scrollview的内容绘制到PDF上下文&我遇到了pagination的问题。

遵循我使用过的代码:

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

我的代码有什么问题吗?

6 个答案:

答案 0 :(得分:1)

我认为你不需要翻转PDF的代码。我之前已经完成了这个(手动分页,但是没有滚动视图)并且从不必垂直翻转上下文。我主要担心的是你在每次迭代时都这样做 - 如果你有一个合理的理由可以翻转它,你可能在循环中不需要它,但在循环开始之前只需要一次。此外,代码CGContextTranslateCTM(pdfContext,0,-ty);可能需要替换为CGContextTranslateCTM(pdfContext,0,heightOfPdf);

如果这不起作用,请尝试UIGraphicsBeginPDFPage();而不是CGContextBeginPage(),这是您的代码与我的代码之间唯一的主要区别。

答案 1 :(得分:1)

找到这个链接来呈现PDF,它说的是多个页面,但没有显示实现。它没有直接回答您的问题,但它告诉一个更简单的方法来渲染PDF文件,翻译和转换少得多。

Render PDF

Generate Multipage PDF -anoop

答案 2 :(得分:1)

您需要添加到pdf页面的部分放在滚动内的单独视图中,并将视图渲染到pdf上下文

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。您可以使用它来绘制所有内容。

答案 3 :(得分: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);

}

答案 4 :(得分:1)

您可以考虑使用UIScrollView来布局单独的PDF页面。以下方法在视图(PDFView)中加载每个PDF页面,并以居中的方式将其添加到滚动视图内容:

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

答案 5 :(得分: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);
}