Белая рамка при рендеринге PDF при масштабе> 1 - PullRequest
1 голос
/ 27 мая 2011

У меня есть метод, который возвращает UIImage из CGPDFPageRef.Вы можете указать ширину для изображения.

Проблема в том, что когда pdfScale равен> 1, на изображении появляется белая рамка.Таким образом, PDF всегда рисуется в масштабе 1 с рамкой, а не с большим масштабом.Меньшие масштабы - это нормально.

Я пытался изменить тип PDFBox, но, похоже, это ничего не меняет, и документация не совсем понятна.

Кто-то видит ошибку?

- (UIImage*) PDFImageForWidth:(CGFloat) width {
    CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFCropBox);
    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();

    CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
    CGContextFillRect(context, pageRect);

    CGContextTranslateCTM(context, 0.0, pageRect.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextConcatCTM(context, CGPDFPageGetDrawingTransform(page, kCGPDFCropBox, pageRect, 0, true));

    CGContextDrawPDFPage(context, page);
    UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

Ответы [ 2 ]

2 голосов
/ 27 мая 2011

Проблема была в том, что CGPDFPageGetDrawingTransform не масштабирует PDF при масштабировании> 1. Вы должны сделать это самостоятельно.

Кроме того, метод теперь безопасен для потоков.

- (UIImage*) PDFImageForWidth:(CGFloat) width {
    CGRect smallPageRect = CGPDFPageGetBoxRect(page, kCGPDFCropBox);
    CGFloat pdfScale = width/smallPageRect.size.width;

    CGRect pageRect;
    pageRect.size = CGSizeMake(smallPageRect.size.width*pdfScale, smallPageRect.size.height*pdfScale);
    pageRect.origin = CGPointZero;

    __block CGContextRef context;
    dispatch_sync(dispatch_get_main_queue(), ^{
        UIGraphicsBeginImageContext(pageRect.size);
        context = UIGraphicsGetCurrentContext();
    });

    if (context != nil) {
        CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
        CGContextFillRect(context, pageRect);

        CGContextTranslateCTM(context, 0.0, pageRect.size.height);
        CGContextScaleCTM(context, 1.0, -1.0);

        CGAffineTransform transform = CGPDFPageGetDrawingTransform(page, kCGPDFCropBox, pageRect, 0, true);
        if (pdfScale > 1) {
            transform = CGAffineTransformScale(transform, pdfScale, pdfScale);
            transform.tx = 0;
            transform.ty = 0;
        }
        CGContextConcatCTM(context, transform);

        CGContextDrawPDFPage(context, page);

        __block UIImage* image;
        dispatch_sync(dispatch_get_main_queue(), ^{
            image = [UIGraphicsGetImageFromCurrentImageContext() retain];
            UIGraphicsEndImageContext();
        });

        return [image autorelease];  
    }
    else return nil;
}
0 голосов
/ 12 апреля 2013

У меня была та же проблема, и ответ, который был раньше, помог мне в некоторых частях, но он не решил всю проблему.

Так я решил свою проблему.

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
    NSLog(@"pdfQuartzViewViewController - drawLayer");

    CGPDFDocumentRef myDocumentRef = CGPDFDocumentCreateWithURL((CFURLRef)[NSURL fileURLWithPath:self.strFilename]);
    CGPDFPageRef pageReference = CGPDFDocumentGetPage(myDocumentRef, 1);

    CGContextSetRGBFillColor(context, 1.0f, 1.0f, 1.0f, 1.0f); // White
    CGContextFillRect(context, CGContextGetClipBoundingBox(context)); // Fill

    CGContextTranslateCTM(context, 0.0f, layer.bounds.size.height);

    // Scaling the pdf page a little big bigger than the view so we can cover the white borders on the page
    CGContextScaleCTM(context, 1.0015f, -1.0015f);
    CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(pageReference, kCGPDFCropBox, layer.bounds, 0, true);
    pdfTransform.tx = pdfTransform.tx - 0.25f;
    pdfTransform.ty = pdfTransform.ty - 0.40f;

    CGContextConcatCTM(context, pdfTransform);

    CGContextDrawPDFPage(context, pageReference); // Render the PDF page into the context

    CGPDFDocumentRelease(myDocumentRef);
    myDocumentRef = NULL;
}

Здесь есть хорошая ссылка, где вы можете найти больше информации об этом.В посте объясняется, как использовать все эти методы.

http://iphonedevelopment.blogspot.ch/2008/10/demystifying-cgaffinetransform.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...