Рендеринг CGPDFPage в UIImage - PullRequest
5 голосов
/ 09 января 2011

Я пытаюсь отобразить CGPDFPage (выбранный из CGPDFDocument) в UIImage для отображения на виде.

У меня есть следующий код в MonoTouch, который помогает мне в этом.

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 отображается, но поворачивается спереди назад и вверх ногами. У меня вопрос, как мне выбрать полную страницу PDF и перевернуть ее, чтобы правильно отобразить. Я видел несколько примеров использования ScaleCTM и TranslateCTM, но не смог заставить их работать.

Все примеры в ObjectiveC подойдут, я возьму любую помощь, которую смогу получить:)

Спасибо

1 Ответ

15 голосов
/ 09 января 2011

Я не работал с MonoTouch.Тем не менее, в target-C вы получите изображение для PDF-страницы, как это (обратите внимание на преобразования 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;

}
...