programing

Contex 그리기 + 페이지 매김

firstcheck 2021. 1. 16. 09:54
반응형

Contex 그리기 + 페이지 매김


의 내용을 컨텍스트 scrollview그리려고하는데 .PDFpagination

내가 사용한 다음 코드 :

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

필요한 수의 페이지를 생성하지만 콘텐츠를 잘못 배치합니다. 다음 그림에 설명되어 있습니다.여기에 이미지 설명 입력

내 코드에 문제가 있습니까?


PDF를 거꾸로 뒤집는 코드가 필요하지 않다고 생각합니다. 이전에이 작업을 수행했으며 (수동 페이지 매김, 스크롤 뷰 없음) 컨텍스트를 수직으로 뒤집을 필요가 없었습니다. 내 주요 관심사는 매 반복마다 수행하고 있다는 것입니다. 뒤집을 타당한 이유가 있다면 아마도 루프에서 필요하지 않지만 루프가 시작되기 전에 한 번만 가능합니다. 또한 코드 CGContextTranslateCTM(pdfContext,0,-ty);를 다음으로 대체해야 할 수도 있습니다.CGContextTranslateCTM(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를 렌더링하는 더 간단한 방법을 알려줍니다.

PDF 렌더링

다중 페이지 PDF 생성 -anoop


를 사용 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)];
}

경우은 drawRect 또는 drawLayer 구현에서 PDFView단일 렌더링을 담당합니다 CGPDFPageRef.


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를 그리는 데는 많은 그리기 방법이 있습니다. 그것을 사용하여 모든 내용을 그릴 수 있습니다.


이것은 당신을 도울 것입니다.

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

참조 URL : https://stackoverflow.com/questions/7607167/contex-drawing-pagination

반응형