Contex 그리기 + 페이지 매김
의 내용을 컨텍스트 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);
}
}
필요한 수의 페이지를 생성하지만 콘텐츠를 잘못 배치합니다. 다음 그림에 설명되어 있습니다.
내 코드에 문제가 있습니까?
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 생성 -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
'programing' 카테고리의 다른 글
libgdx (roboVM)를 사용하여 iOS 라이브러리 또는 프레임 워크 만들기 (0) | 2021.01.16 |
---|---|
oriento / orientjs의 여러 레코드 선택 및 업데이트 및 워터 라인의 트랜잭션 (0) | 2021.01.16 |
GPU를 사용하여 MATLAB 코드 가속화? (0) | 2021.01.16 |
vim의 함수 본문에서 인수 강조 (0) | 2021.01.16 |
Android에서 ColorMatrixFilter를 사용하여 블렌드 모드를 빼시겠습니까? (0) | 2021.01.16 |