开发者

White border when rendering PDF when scale > 1

I 开发者_JS百科have a method that return an UIImage from a CGPDFPageRef. You can specify a width for the image.

The problem is that when pdfScale is > 1, a white border appears in the image. So the PDF is always drawn at scale 1 with a border instead of a bigger scale. Smaller scales are OK.

I've tried to change the type of PDFBox but that doesn't seems to change anything and the documentation is not really clear.

Does somebody sees the error?

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


The problem was that CGPDFPageGetDrawingTransform doesn't scale the PDF when scale > 1. You have to do it yourself.

Also, the method is thread safe now.

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


I was having the same problem and the answer before did help me in some parts but it didn't solve the whole problem.

This is the how I solved my problem.

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

Here there is a good link where you can find more information about it. The post explains how to use all this methods.

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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜