Подтвердить что ты не робот

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

Что-то не так в моем коде?

4b9b3361

Ответ 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);
}