objective framework developer apple iphone ios pdf quartz-2d cgcontext

iphone - framework - Contex Drawing+Pagination



swift ios documentation (6)

Encontré este enlace para renderizar un PDF, dice sobre varias páginas pero no ha mostrado una implementación. No responde de inmediato a su pregunta, pero le dice que es un método más simple para procesar un pdf con mucha menos traducción y transformación.

Render PDF

Generar PDF de varias páginas -anoop

Estoy tratando de dibujar los contenidos de scrollview en un contexto PDF y estoy enfrentando problemas con la pagination .

Siguiendo el Código que he usado:

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

Crea el número requerido de páginas pero coloca el contenido incorrectamente. La siguiente figura lo explica.

¿Hay algo mal en mi código?


Las porciones que necesita agregar a las páginas en formato PDF colocan en vistas separadas dentro del desplazamiento y muestran esa vista en el contexto en formato PDF.

O

Solo encuentra las dimensiones correctas y dibuja usando el método 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];

Hay muchos métodos de dibujo para dibujar pdf. Puedes usar eso para dibujar todos los contenidos.


No creo que necesites el código que da la vuelta al PDF. He hecho esto antes (paginación manual, pero sin una vista de desplazamiento) y nunca tuve que voltear el contexto verticalmente. Mi principal preocupación es que lo hagas en cada iteración; si tienes una razón válida para lanzarlo, probablemente no lo necesites en el ciclo, sino solo una vez antes de que comience el ciclo. También el código CGContextTranslateCTM(pdfContext,0,-ty); podría necesitar ser reemplazado con CGContextTranslateCTM(pdfContext,0,heightOfPdf);

Si eso no funciona, pruebe UIGraphicsBeginPDFPage(); en lugar de CGContextBeginPage() , esa es la única diferencia importante entre tu código y el mío.


Podría considerar usar un UIScrollView para diseñar sus páginas PDF separadas. El siguiente método carga cada página PDF en una vista ( PDFView ) y la agrega al contenido de la vista de desplazamiento de forma centrada:

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

En este caso, PDFView es responsable de representar un único CGPDFPageRef en su implementación drawRect o drawLayer.


esto podría ayudarte.

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


This proyecto github definitivamente puede ayudarte.

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

}