Contex绘图+分页

我正在尝试将scrollview内容scrollviewPDF上下文中,并且我正面临着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); } } 

它会创build所需数量的页面,但会错误地放置内容。 下图解释它。 在这里输入图像说明

我的代码有什么问题吗?

我不认为你需要翻转PDF翻转的代码。 我以前做过(手动分页,但没有滚动视图),而不必垂直翻转上下文。 我主要关心的是你在每一次迭代中都这样做 – 如果你有一个合理的翻转原因,你可能不需要在循环中,而只是在循环开始之前。 另外代码CGContextTranslateCTM(pdfContext,0,-ty); 可能需要用CGContextTranslateCTM(pdfContext,0,heightOfPdf);replaceCGContextTranslateCTM(pdfContext,0,heightOfPdf);

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

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

}

发现这个链接来呈现PDF,它说了多个页面,但没有显示一个实现。 它不会直接回答你的问题,但它告诉一个更简单的方法来渲染一个PDF更less的翻译和转换。

渲染PDF

生成多页PDF -anoop

你可以考虑使用UIScrollView来devise你的单独的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。

您需要添加到PDF页面的部分在滚动内部放置独立的视图,并呈现PDF上下文的视图

要么

只需find正确的尺寸,并使用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。 你可以使用它来绘制所有的内容。

这可能会帮助你。

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