How to scale up a PDF containing a vector-based gr

2019-05-22 23:59发布

问题:

ok so here is what I want to do:

  • Load a PDF containing a vector graphic
  • Scale it up
  • Draw it to a graphics context
  • Create a UIImage from the result and present it

Everything works fine, except the fact that the graphic loses quality and looks pixelized :(

Here is the code where the scaling happens:

// PDF loaded before
CGPDFPageRef page = CGPDFDocumentGetPage (document, 1);

UIGraphicsBeginImageContext(CGSizeMake(width, height)); 

CGContextRef context = UIGraphicsGetCurrentContext();   
CGContextSaveGState(context);

CGRect rect = CGPDFPageGetBoxRect(page, kCGPDFCropBox);
float widthFactor = width/ rect.size.width; 
float heightFactor = height/ rect.size.height;
CGAffineTransform pdfTransform2 = CGAffineTransformMakeScale (widthFactor, heightFactor);
CGContextConcatCTM(context, pdfTransform2);

CGContextDrawPDFPage(context, page);
CGContextRestoreGState(context);

retValue = UIGraphicsGetImageFromCurrentImageContext();  
UIGraphicsEndImageContext();

I think the problem is that I can only rescale the context, not the actual PDF. Is there any other way to do that without quality loss?

Thank you so much for any hint!

回答1:

it's me again, the one who asked the question. I couldn't recover my account, so I created a new one...

Ok here's the answer: search the Xcode documentation for the sample project called ZoomingPDFViewer. It contains everything you need to scale a PDF document without quality loss.



回答2:

You may be messing up the proportions of the image. I.e., when you scale with:

CGAffineTransform pdfTransform2 = CGAffineTransformMakeScale (widthFactor, heightFactor);

try using one scale only:

CGAffineTransform pdfTransform2 = CGAffineTransformMakeScale (widthFactor, widthFactor);