I'm trying to create a tool to rasterise vector images—stored in PDF files—on macOS, but the resulting images contain artifacts around the edges of some shapes. Preview.app, on the other hand, always renders the PDF flawlessly, as shown in this example:
I've tried:
- Loading the PDF document using PDFKit, and rendering the page using both
draw(with:to:)
andthumbnail(of:for:)
- Loading the PDF document into an
NSImage
(which creates anNSPDFImageRep
), and usingcgImage(forProposedRect:context:hints:)
In both cases I get these aliasing-like artifacts as seen on the left-hand-side of the image above. The PDF file is out of my control, so can't be changed to fix any issues it might have. I'm currently trying to migrate away from Cairo (which renders correctly) to Apple's PDF rendering for performance reasons (PDFKit renders it much more quickly, albeit with these artifacts).
Is there anything I've missed which would fix the output?
CodePudding user response:
So it looks like the issue was caused due to me rasterising PDFs on multiple threads (specifically my tool rasterises PDFs in multiple resolutions, so I thought why not simultaneously).
Performing the operations sequentially on the main thread instead fixed it. I thought that I had come up with a way to use it concurrently by initialising the CGContext
manually (instead of using NSImage
's lockFocus()
/unlockFocus()
and NSGraphicsContext.current
), but alas, as I soon as I add a context.scaleBy
(to generate the images at different sizes), it fails again.
So for now I'm just doing it on the main thread until another solution comes along.