2016-03-14 2 views
0

В моем проекте мне нужно создать изображение страницы PDF, сгенерированное с помощью CoreGraphics.Force PDF-страница для заполнения контекста

Мне удалось создать контекст с размером изображения, которое я хочу (destinationSize: CGSize), но когда я использую функцию CGPDFPageGetDrawingTransform, она только изменяет размер страницы вниз, но не будет масштабировать контекст, чтобы сделать заполнение страницы адрес назначения.

Вот отрывок кода я прямо сейчас в моем проекте:

UIGraphicsBeginImageContextWithOptions(destinationSize, true, 0) 

defer { 
    UIGraphicsEndImageContext() 
} 

// Invert y axis (CoreGraphics and UIKit axes are differents) 
CGContextTranslateCTM(ctx, 0, destinationSize.height); 
CGContextScaleCTM(ctx, 1, -1) 

let transform = CGPDFPageGetDrawingTransform(pageRef, .CropBox, CGRect(origin: CGPointZero, size: destinationSize), 0, true) 
CGContextConcatCTM(ctx, transform) 

// TODO We need force the page to fill all the dest rect when it's bigger than the CropBox size 

CGContextDrawPDFPage(ctx, pageRef) 

Я попытался масштабировать свой контекст с помощью масштабного коэффициента с этим, заменив TODO:

let contextScale: CGFloat = (pageRect.width < expectedWidth) ? expectedWidth/pageRect.width : 1 
CGContextScaleCTM(ctx, contextScale, contextScale) 

но он создал неправильное смещение чертежа, и я как бы потерялся с преобразованиями CoreGraphics.

Каким будет правильный способ изменить масштаб контекста, чтобы убедиться, что страница в формате pdf предназначена для заполнения размера контекста?

ответ

0

Это решение, с которым я столкнулся.

Для чего я знаю, это работает для любой страницы PDF-документа. (испытания с большим числом оборотов, размеры и происхождение обрезных площадок.

func transformationForPage(_ pageNumber: Int, targetSize: CGSize) -> CGAffineTransform { 
    let pageRef = getPage(pageNumber) 
    let rotation = getPageRotationInteger(pageNumber) 
    let cropbox = cropboxForPage(pageNumber) 

    var transform = pageRef!.getDrawingTransform(.cropBox, rect: CGRect(origin: CGPoint.zero, size: targetSize), rotate: 0, preserveAspectRatio: true) 

    // We change the context scale to fill completely the destination size 
    if cropbox.width < targetSize.width { 
     let contextScale = targetSize.width/cropbox.width 
     transform = transform.scaledBy(x: contextScale, y: contextScale) 

     transform.tx = -(cropbox.origin.x * transform.a + cropbox.origin.y * transform.b) 
     transform.ty = -(cropbox.origin.x * transform.c + cropbox.origin.y * transform.d) 

     // Rotation handling 
     if rotation == 180 || rotation == 270 { 
      transform.tx += targetSize.width 
     } 
     if rotation == 90 || rotation == 180 { 
      transform.ty += targetSize.height 
     } 
    } 

    return transform 
}