2010-10-11 12 views
7

ich eine PDF-Seite auf dem CGContext Anzeige des CodeCGContext pdf Seite Aspekt passen

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 
{ 
    CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0); 
    CGContextFillRect(ctx, layer.bounds); 
    CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height); 
    CGContextScaleCTM(ctx, 1.0, -1.0); 
    CGContextConcatCTM(ctx, CGPDFPageGetDrawingTransform(myPageRef, kCGPDFBleedBox, layer.bounds, 0, true)); 
    CGContextDrawPDFPage(ctx, myPageRef); 
} 

Das Problem ist, dass die PDF-Seite auf der Mitte der Seite gezogen zu werden auf allen vier Seiten Grenze verlassen. Gibt es eine Möglichkeit, die Seite auf den Bildschirm anzupassen?

Antwort

15

Um auf Tias Antwort zu erweitern; Die integrierte Methode CGPDFPageGetDrawingTransform wird zwar verkleinert, aber nicht vergrößert. Wenn Sie den Maßstab vergrößern möchten, müssen Sie Ihre eigene Transformation berechnen, indem Sie die Ergebnisse von CGPDFGetBoxRect mit Ihrem Inhaltsbereich vergleichen. Typing unvorbereitet:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 
{ 
    CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0); 
    CGContextFillRect(ctx, layer.bounds); 
    CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height); 
    CGContextScaleCTM(ctx, 1.0, -1.0); 

    CGRect cropBox = CGPDFGetBoxRect(myPageRef, kCGPDFCropBox); 
    CGRect targetRect = layer.bounds; 
    CGFloat xScale = targetRect.size.width/cropBox.size.width; 
    CGFloat yScale = targetRect.size.height/cropBox.size.height; 
    CGFloat scaleToApply = xScale < yScale ? xScale : yScale; 
    CGContextConcatCTM(ctx, CGAffineTransformMakeScale(scaleToApply, scaleToApply));  

    CGContextDrawPDFPage(ctx, myPageRef); 
} 

Also: ausrechnen, wie viel Sie das Dokument skalieren müssen, indem es die gesamte Breite der Ansicht zu besetzen, wie viel die gesamte Höhe zu besetzen und dann skaliert tatsächlich durch die geringere von diesen zwei Werten.

+0

können Sie bitte diese Frage beantworten, ich versuche auch auf die gleiche Weise, aber ich kann nicht die genaue Passform erhalten http://StackOverflow.com/Questions/3908624/CGCONTEXT-PDF-PAGE-aspect-fit – ajay

+0

Das ist ein Link zu dieser Frage; wahrscheinlich meintest du http://stackoverflow.com/questions/4321681/how-to-fit-pdf-page-in-entire-view? Ich werde es mir ansehen, sobald ich eine Chance bekomme, obwohl ich jetzt leider auf dem Weg nach draußen bin ... – Tommy

+0

Minor Update, CGPDFGetBoxRect scheint jetzt CGPDFPageGetBoxRect zu sein, aber unglaublich hilfreich! Diese Dimensionierung hat mich verrückt gemacht. Sie können auch die Zeile CGContextConcatCTM finden (ctx, CGPDFPageGetDrawingTransform (myPageRef, kCGPDFCropBox, layer.bounds, 0, true)); vor der CGContextDrawPDFPage hilft mit PDF-Dateien, die 90 Degees gedreht werden – sradforth

1

Das genaue Lesen Ihres Codes deutet darauf hin, dass die Verwendung von kCGPDFBleedBox durch eine andere Einstellung ersetzt werden sollte, vielleicht kCGPDFMediaBox. Weitere Informationen finden Sie unter here.

+0

fbrereto, habe ich kCGPDFMediaBox und alle anderen verfügbaren Optionen versucht. Aber es gibt keine Veränderung in der Anzeige. –

2

Die CGPDFPageGetDrawingTransform wird gerade keine Scale-Up-Transformation zurückgeben, wenn das PDF-Seitenrechteck kleiner als der rect Parameter ist.

+0

tia, ich habe die gleiche Seite in einigen anderen PDF-Reader-Anwendungen versucht und wird richtig auf den Bildschirm angezeigt. Gibt es also eine andere Möglichkeit, es so zu zeichnen, dass es zum Aspekt passt? –

0

Die anderen Antworten sind korrekt, dass CGPDFPageGetDrawingTransform nicht hochskaliert wird. Sie können jedoch das Rechteck nach unten skalieren, um nur die ausgewählte Box zu erfassen. Verwenden Sie CGPDFPageGetBoxRect() und berechnen Sie die Skalierung wie von Tommy in der akzeptierten Antwort vorgeschlagen, und verwenden Sie diese, um das in CGPDFPageGetDrawingTransform() übergebene Erfassungsrechteck zu verkleinern.

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 
{ 
    CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0); 
    CGContextFillRect(ctx, layer.bounds); 
    CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height); 

    CGRect box = CGPDFGetBoxRect(myPageRef, kCGPDFBleedBox); 
    CGFloat xScale = layer.bounds.size.width/cropBox.size.width; 
    CGFloat yScale = layer.bounds.size.height/cropBox.size.height; 
    CGFloat scaleToApply = xScale < yScale ? xScale : yScale; 

    CGRect captureRect = CGRectMake(0, 0, 
            layer.bounds.size.width/scaleToApply, 
            layer.bounds.size.height/scaleToApply); 

    CGAffineTransform drawXfm = CGPDFPageGetDrawingTransform(myPageRef, 
                  kCGPDFBleedBox, 
                  captureRect, 
                  0, 
                  true); 

    CGContextScaleCTM(ctx, scaleToApply, -scaleToApply); 
    CGContextConcatCTM(ctx, drawXfm); 
    CGContextDrawPDFPage(ctx, myPageRef); 
} 

Dann ist es leicht zu handhaben Landschaft erweitert:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 
{ 
    CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0); 
    CGContextFillRect(ctx, layer.bounds); 
    CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height); 

    CGRect box = CGPDFGetBoxRect(myPageRef, kCGPDFBleedBox); 
    int rotate; 
    CGFloat xScale, yScale; 
    if (box.size.width > box.size.height) { 
     // landscape 
     rotate = 270; 
     xScale = layer.bounds.size.height/cropBox.size.width; 
     yScale = layer.bounds.size.width/cropBox.size.height; 
    } else { 
     // portrait 
     rotate = 0; 
     xScale = layer.bounds.size.width/cropBox.size.width; 
     yScale = layer.bounds.size.height/cropBox.size.height; 
    } 
    CGFloat scaleToApply = xScale < yScale ? xScale : yScale; 

    CGRect captureRect = CGRectMake(0, 0, 
            layer.bounds.size.width/scaleToApply, 
            layer.bounds.size.height/scaleToApply); 

    CGAffineTransform drawXfm = CGPDFPageGetDrawingTransform(myPageRef, 
               kCGPDFBleedBox, 
               captureRect, 
               rotate, 
               true); 

    CGContextScaleCTM(ctx, scaleToApply, -scaleToApply); 
    CGContextConcatCTM(ctx, drawXfm); 
    CGContextDrawPDFPage(ctx, myPageRef); 
} 
0

Hier ist meine Lösung, die auch Drehgriffe. Könnte nützlich sein.

// Create transformation 
int rotation = CGPDFPageGetRotationAngle(pdfPage); 
CGRect rect = CGPDFPageGetBoxRect(pdfPage, kCGPDFCropBox); 
CGRect rotatedRect = rect; 
CGRectApplyAffineTransform(rotatedRect, CGAffineTransformMakeRotation(M_PI * rotation/180.0)); 

CGFloat scale = MIN(self.bounds.size.width/rotatedRect.size.width, self.bounds.size.height/rotatedRect.size.height); 
// Scale 
CGContextConcatCTM(context, CGAffineTransformMakeScale(scale, scale)); 
// Move left bottom cornet to 0, 0 
CGContextConcatCTM(context, CGAffineTransformMakeTranslation(rotatedRect.size.width * 0.5, rotatedRect.size.height * 0.5));  
// Rotate 
CGContextConcatCTM(context, CGAffineTransformMakeRotation(-M_PI * rotation/180.0));  
// Move center into 0, 0 
CGContextConcatCTM(context, CGAffineTransformMakeTranslation(-rect.origin.x - rect.size.width * 0.5, -rect.origin.y - rect.size.height * 0.5)); 

CGContextDrawPDFPage(context, pdfPage);