Contex Drawing + Pagination
Я пытаюсь сделать содержимое 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 end it.
CGContextEndPage (pdfContext);
}
}
Создает необходимое количество страниц, но неправильно помещает контент. Следующий рисунок объясняет это. ![enter image description here]()
Что-то не так в моем коде?
Ответы
Ответ 1
Я не думаю, что вам нужен код, который переворачивает PDF-код вверх дном. Я делал это раньше (ручная разбивка на страницы, но без прокрутки) и никогда не пришлось переворачивать контекст по вертикали. Моя основная забота заключается в том, что вы делаете это на каждой итерации - если у вас есть веская причина для ее переворачивания, вам, вероятно, это не нужно в цикле, а всего лишь один раз до начала цикла. Также возможно, что код CGContextTranslateCTM(pdfContext,0,-ty);
должен быть заменен на CGContextTranslateCTM(pdfContext,0,heightOfPdf);
Если это не сработает, попробуйте UIGraphicsBeginPDFPage();
вместо CGContextBeginPage()
, что единственное существенное различие между вашим кодом и моим.
Ответ 2
Нашел эту ссылку для рендеринга PDF, она говорит о нескольких страницах, но не показала реализацию. Он не сразу отвечает на ваш вопрос, но он говорит о более простом способе визуализации PDF с гораздо меньшим переводом и преобразованиями.
Render PDF
Создать многостраничный PDF
-anoop
Ответ 3
Части, которые нужно добавить к страницам PDF, помещаются в отдельные просмотры внутри прокрутки и отображают вид в контексте pdf
ИЛИ
Просто найдите правильные размеры и рисуйте с помощью метода 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. Вы можете использовать это, чтобы нарисовать все содержимое.
Ответ 4
Этот проект 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);
}
Ответ 5
Вы можете использовать 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
отвечает за рендеринг одного CGPDFPageRef
в его реализации drawRect или drawLayer.
Ответ 6
это может вам помочь.
- (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);
}