2011-01-09 18 views
5

Bir CGPDFPage'i (bir CGPDFDocument öğesinden seçili) bir görünümde görüntülemek üzere bir UIImage'a işlemeye çalışıyorum.Bir CGPDFPage'i bir UIImage'ye dönüştürme

MonoTouch'da aşağıdaki kodu kullanıyorum.

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

CGPDFPage'ın bir bölümü görüntülenir, ancak önden arkaya ve tersine döndürülebilir. Sorum şu: Tam pdf sayfasını nasıl seçebilirim ve doğru şekilde görüntülemek için çeviririm. ScaleCTM ve TranslateCTM kullanarak birkaç örnek gördüm, ancak çalışmayı başaramadılar. ObjectiveC

Herhangi örnekler ben :) olsun

Teşekkür

cevap

13

Ben MonoTouch ile çalışmamış her türlü yardıma alacağım, gayet iyi. Ancak, objektif-C'de, bu gibi bir PDF sayfası için bir görüntü elde edersiniz (CTM dönüşümlerini dikkate alınız):

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

Harika çalışıyor, teşekkürler! MonoTouch'a taşındı bu gibi bir şey görünüyor https://gist.github.com/771759 –

+1

Merhaba Felz, Ben PDF küçük resimler almak için kodunuzu kullanıyorum. CGContextConcatCTM (bağlam, CGPDFPageGetDrawingTransform (sayfa, kCGPDFMediaBox, pageRect, 0, true)) satırı bir bellek darboğaz üretir gibi görünüyor, ben bu satırı ayrılırsam, o zaman Tamam olduğunu öğrendim. Ama onu dışarıda bırakamam çünkü uygun bir küçük resim için buna ihtiyacım var. Bunu nasıl geliştirebiliriz hakkında bir fikrin var mı? Thx btw ... – aslisabanci

+0

Sadece bir soru: '' CGPDFPageRef sayfa = [self getPage: page_number]; 'bir hata atar. Gömülü kod hangi türde viewController? – DAS

İlgili konular