Sahil Sahil - 3 months ago 31
Objective-C Question

High quality UIImage from PDF

I'm converting a PDF page into a UIImage. While doing so, I lose the image quality. Need help in getting high quality images.

Code to generate UIImage

-(UIImage *)imageForPage:(int)pageNumber {
CGPDFPageRef pdfPageRef = [self pdfReferenceForPage:pageNumber];

CGSize pageSize = [self sizeOfPage:pageNumber];

//UIGraphicsBeginImageContext(pageSize);

UIGraphicsBeginImageContextWithOptions(pageSize, NO, 0.0);

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);

CGContextTranslateCTM(context, 0.0, pageSize.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextSaveGState(context);

CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(pdfPageRef, kCGPDFCropBox, CGRectMake(0, 0, pageSize.width, pageSize.height), 0, true);
CGContextConcatCTM(context, pdfTransform);

CGContextDrawPDFPage(context, pdfPageRef);
CGContextRestoreGState(context);

UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return resultingImage;
}


- (void)saveImage {
UIImage *image = [self imageForPage:1];
[UIImageJPEGRepresentation(image, 1.0) writeToFile:filePath atomically:YES];
}


Image comparison

Original PDF
Original PDF




Image from PDF
Image from PDF

----------



EDIT: CODE WITH CHANGES

float dpi = 100.0 / 72.0;

CGPDFPageRef pdfPageRef = [self pdfReferenceForPage:pageNumber];

CGSize pageSize = [self sizeOfPage:pageNumber];
pageSize.width = pageSize.width * dpi;
pageSize.height = pageSize.height * dpi;

UIGraphicsBeginImageContext(pageSize);

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
CGContextTranslateCTM(context, 0.0, pageSize.height);
CGContextScaleCTM(context, dpi, -dpi);
CGContextSaveGState(context);
//CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(pdfPageRef, kCGPDFCropBox, CGRectMake(0, 0, pageSize.width, pageSize.height), 0, true);
//CGContextConcatCTM(context, pdfTransform);
CGContextDrawPDFPage(context, pdfPageRef);
CGContextRestoreGState(context);

UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return resultingImage;

Answer

When you ask the PDF for it's page size, you're getting a width/height for 72 PPI. You might try creating a context that's scaled up using a scale transform. For example, if you wanted to render at 300 dpi, add a scale transform to scale by 300.0/72.0.

If you export as TIFF, you will be able to encapsulate the final PPI (300) of the generated image.