2011-01-09 7 views
5

Próbuję renderować stronę CGPDF (wybraną z dokumentu CGPDFDocument) do obiektu UII, aby wyświetlić w widoku.Renderowanie strony CGPDF w UIImage

Mam następujący kod w MonoTouch, który doprowadza mnie częściowo do tego.

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

Sekcja strony CGPDF jest wyświetlana, ale jest obracana od tyłu do przodu i do góry nogami. Moje pytanie brzmi: jak wybrać pełną stronę pdf i odwrócić ją, aby wyświetlić poprawnie. Widziałem kilka przykładów przy użyciu ScaleCTM i TranslateCTM, ale nie mogłem ich uruchomić.

Wszelkie przykłady w ObjectiveC są w porządku, wezmę wszelką pomoc mogę uzyskać :)

Thanks

Odpowiedz

13

Nie pracuję z MonoTouch. Jednak w celu C można uzyskać obraz strony PDF w ten sposób (zauważyć transformacje 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

Działa świetnie, dzięki! Przeniesiony do MonoTouch wygląda to tak: https://gist.github.com/771759 –

+1

Witam Felz, używam Twojego kodu, aby uzyskać miniatury PDF. Wygląda na to, że linia CGContextConcatCTM (kontekst, CGPDFPageGetDrawingTransform (strona, kCGPDFMediaBox, pageRect, 0, true)) tworzy wąskie gardło pamięci, dowiedziałem się, że jeśli zostawię tę linię, to jest OK. Ale nie mogę tego pominąć, ponieważ potrzebuję tego dla odpowiedniej miniatury. Czy masz pomysł, jak możemy to poprawić? Thx btw ... – aslisabanci

+0

Tylko jedno pytanie: 'CGPDFPageRef page = [self getPage: page_number];' wyrzuca błąd. Jakiego rodzaju viewController jest kod osadzony w? – DAS