当缩放时渲染PDF时的白色边框> 1

时间:2011-05-26 21:53:59

标签: iphone cocoa-touch pdf core-graphics

我有一个从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 个答案:

答案 0 :(得分:2)

问题是CGPDFPageGetDrawingTransform在缩放>时不会缩放PDF。你必须自己做。

此外,该方法现在是线程安全的。

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

答案 1 :(得分:0)

我遇到了同样的问题,之前的答案在某些方面对我有所帮助,但并没有解决整个问题。

这就是我解决问题的方法。

- (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