CGContext PDF формат страницы подходит - PullRequest
7 голосов
/ 11 октября 2010

Я отображаю pdf-страницу в CGContext, используя код

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

Проблема состоит в том, что pdf-страница рисуется в центре страницы, оставляя границу со всех четырех сторон.Есть ли способ сделать страницу подходящей для экрана.

Ответы [ 5 ]

16 голосов
/ 14 октября 2010

Расширить ответ Тиа; встроенный метод CGPDFPageGetDrawingTransform будет уменьшать, но не увеличивать. Если вы хотите увеличить масштаб, вам нужно выработать собственное преобразование, сравнив результаты CGPDFGetBoxRect с вашей областью контента. Печатая сразу:

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

Итак: определите, насколько вам нужно масштабировать документ, чтобы он занимал всю ширину вида, сколько занимать всю высоту, а затем фактически масштабировать до меньшего из этих двух значений.

2 голосов
/ 11 октября 2010

CGPDFPageGetDrawingTransform просто не вернет масштабное преобразование, если прямоугольник страницы PDF меньше параметра rect.

1 голос
/ 11 октября 2010

При быстром чтении вашего кода использование kCGPDFBleedBox следует заменить другим параметром, например kCGPDFMediaBox.См. здесь для получения дополнительной информации.

0 голосов
/ 20 июня 2011

Вот мое решение, которое также обрабатывает вращение.Может быть полезным.

// 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);
0 голосов
/ 28 мая 2011

Другие ответы верны, что CGPDFPageGetDrawingTransform не будет масштабироваться, однако вы можете уменьшить прямоугольник, чтобы захватить только выбранный блок.Используйте CGPDFPageGetBoxRect () и вычислите масштаб, как Томми предложил в принятом ответе, затем используйте его для уменьшения прямоугольника захвата, переданного в CGPDFPageGetDrawingTransform ().

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

Затем он легко расширяется для обработки ландшафта:

- (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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...