2011-01-09 16 views
5

Estoy tratando de renderizar un CGPDFPage (seleccionado de un CGPDFDocument) en un UIImage para mostrar en una vista.Renderizar un CGPDFPage en un UIImage

Tengo el siguiente código en MonoTouch que me lleva a la mitad.

RectangleF PDFRectangle = new RectangleF(0, 0, UIScreen.MainScreen.Bounds.Width, UIScreen.MainScreen.Bounds.Height); 

    public override void ViewDidLoad() 
    { 
     UIGraphics.BeginImageContext(new SizeF(PDFRectangle.Width, PDFRectangle.Height)); 
     CGContext context = UIGraphics.GetCurrentContext(); 
     context.SaveState(); 

     CGPDFDocument pdfDoc = CGPDFDocument.FromFile("test.pdf"); 
     CGPDFPage pdfPage = pdfDoc.GetPage(1); 

     context.DrawPDFPage(pdfPage); 
     UIImage testImage = UIGraphics.GetImageFromCurrentImageContext(); 

     pdfDoc.Dispose(); 
     context.RestoreState(); 

     UIImageView imageView = new UIImageView(testImage); 
     UIGraphics.EndImageContext(); 

     View.AddSubview(imageView); 
    } 

Se muestra una sección de CGPDFPage pero girada hacia atrás y al revés. Mi pregunta es, ¿cómo selecciono la página completa de PDF y darle la vuelta para que se muestre correctamente? He visto algunos ejemplos que usan ScaleCTM y TranslateCTM pero parece que no funcionan.

Cualquier ejemplo en ObjectiveC están bien, voy a tomar toda la ayuda que pueda conseguir :)

Gracias

Respuesta

13

no he trabajado con MonoTouch. Sin embargo, en el objetivo C obtendría una imagen para una página PDF como esta (observe las transformaciones CTM):

-(UIImage *)getThumbForPage:(int)page_number{ 
CGFloat width = 60.0; 

    // Get the page 
CGPDFPageRef myPageRef = CGPDFDocumentGetPage(myDocumentRef, page); 
// Changed this line for the line above which is a generic line 
//CGPDFPageRef page = [self getPage:page_number]; 

CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox); 
CGFloat pdfScale = width/pageRect.size.width; 
pageRect.size = CGSizeMake(pageRect.size.width*pdfScale, pageRect.size.height*pdfScale); 
pageRect.origin = CGPointZero; 


UIGraphicsBeginImageContext(pageRect.size); 

CGContextRef context = UIGraphicsGetCurrentContext(); 

// White BG 
CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0); 
CGContextFillRect(context,pageRect); 

CGContextSaveGState(context); 

    // *********** 
// Next 3 lines makes the rotations so that the page look in the right direction 
    // *********** 
CGContextTranslateCTM(context, 0.0, pageRect.size.height); 
CGContextScaleCTM(context, 1.0, -1.0); 
CGContextConcatCTM(context, CGPDFPageGetDrawingTransform(page, kCGPDFMediaBox, pageRect, 0, true)); 

CGContextDrawPDFPage(context, page); 
CGContextRestoreGState(context); 

UIImage *thm = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 
return thm; 

} 
+3

Funciona muy bien, gracias! Portado a MonoTouch se ve algo como esto https://gist.github.com/771759 –

+1

Hola Felz, estoy usando tu código para obtener miniaturas de PDF. Parece que la línea CGContextConcatCTM (contexto, CGPDFPageGetDrawingTransform (página, kCGPDFMediaBox, pageRect, 0, verdadero)) produce un cuello de botella de memoria, descubrí que si dejo esta línea, entonces está bien. Pero no puedo dejarlo porque necesito esto para una miniatura adecuada. ¿Tienes alguna idea de cómo podemos mejorar esto? Thx btw ... – aslisabanci

+0

Solo una pregunta: 'CGPDFPageRef page = [self getPage: page_number];' arroja un error. ¿En qué tipo de viewController está incrustado el código? – DAS