我正在尝试将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);
}
}
它会创建所需数量的页面,但会错误地放置内容。下图解释了它。
我的代码有什么问题吗?
答案 0 :(得分:1)
我认为你不需要翻转PDF的代码。我之前已经完成了这个(手动分页,但是没有滚动视图)并且从不必垂直翻转上下文。我主要担心的是你在每次迭代时都这样做 - 如果你有一个合理的理由可以翻转它,你可能在循环中不需要它,但在循环开始之前只需要一次。此外,代码CGContextTranslateCTM(pdfContext,0,-ty);
可能需要替换为CGContextTranslateCTM(pdfContext,0,heightOfPdf);
如果这不起作用,请尝试UIGraphicsBeginPDFPage();
而不是CGContextBeginPage()
,这是您的代码与我的代码之间唯一的主要区别。
答案 1 :(得分:1)
找到这个链接来呈现PDF,它说的是多个页面,但没有显示实现。它没有直接回答您的问题,但它告诉一个更简单的方法来渲染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);
}