If you cannot pre-process the PDF files, and embed the higher resolution thumbnails, then simply adjusting the parameters for PDFViewCtrl.SetupThumbnails would be best.
[self.pdfViewCtrl SetupThumbnails:NO generate_at_runtime:YES use_disk_cache:YES thumb_max_side_length:1024 max_abs_cache_size:500*1024*1024 max_perc_cache_size:0.1];
As of this writing the thumb_max_side_length default is 250, so setting of 1024 will result in noticeably better quality thumbs, though you can of course go as high as you like.
To understand what SetupThumbnails does, consider what happens when PDFViewCtrl displays a page.
1. Blank page is displayed.
2. Two background tasks are launched:
i) One background task begins rendering at the required zoom level
ii) Other background task begins rendering a fixed resolution thumbnail
3. Lower resolution thumbnail appears first (this is the "blurry" image you are seeing), replacing the blank page
4. Full resolution image appears, replacing the low res thumbnail
Later, if the user zooms in, the thumbnail immediately replaces the old image, and remains until the new image at the current zoom is generated. Instead of being blank (which often appears as a flickering)
Also, since disk caching is enabled, if the user closes the PDF, and re-opens, then we jump immediately to #3 above.
This thumbnail cache is stored outside of the PDF file, so it does not need to be modified (making it compatible with digitally signed PDF's for instance). Thumbnails are stored compressed, and can be from any number of documents. The cache simply stores as many as it can. Once out of space, it begins replacing the oldest ones.
Note, that the higher the thumbnail size (default is 250) the longer it will take to generate, meaning a blank page is displayed longer the very first time. Also, less page thumbnails can be cached. But once generated and cached, future page viewing will instantly get the benefit of this nicer looking thumbnail when the user is zooming and panning the page.