Как вы уже знаете, есть 2 способа рендеринга PDF:
- UIWebView
- Кварц Рендеринг
Другие ответы на момент написания этого были сосредоточены на Кварце. Есть несколько веских причин для этого, в основном связанных с производительностью, но, на мой взгляд, использование Quartz того стоит. Я бы порекомендовал прочитать эту ветку , чтобы получить лучшее представление о плюсах и минусах.
По-видимому, есть превосходный новый API для рендеринга PDF на основе кварца здесь
ofc вы можете представить PDF через UIWebView и визуализировать большие пальцы с помощью кварца.
Существует также некоторая путаница вокруг больших пальцев, для людей новая магия кварцевого PDF, может показаться, что после некоторого поиска есть apis, которые поддерживают большие пальцы, мы должны проверить, поддерживает ли встроенный большие пальцы. только многие PDF-файлы не имеют их.
Другой вариант - создать большие пальцы самостоятельно (используя кварц), и в сети есть множество примеров этого, включая два ответа выше. Однако, если вы ориентируетесь на iOS 4 или выше, я настоятельно рекомендую использовать блоки. (Также графические контексты являются потокобезопасными начиная с 4).
Я обнаружил значительное увеличение производительности, когда генерировал большие пальцы с блоками.
Что я делал в прошлом:
Есть ViewController для вашего
превью, у него есть прокрутка
размер контента подходит для всех
ваши страницы. Вставить заполнитель
ImageViews в это, если хотите.
При загрузке документа откиньте большой палец
генератор в фоновом режиме (см. код
ниже)
Приведенный ниже код вызывает метод drawImageView
, который берет индекс страницы, извлекает изображение с диска и помещает его в представление прокрутки
Если ваше чувство действительно мотивировано, вы можете реализовать область рендеринга для большого пальца scrollView (только для рендеринга больших пальцев, которые вам нужны - что-то, что вы должны делать для PDF-файла в любом случае)
Не забудьте удалить большие пальцы, когда вы закончите, если вы не хотите кешировать ..
#define THUMB_SIZE 100,144</p>
<pre><code>-(void)generateThumbsWithGCD
{
thumbQueue = dispatch_queue_create("thumbQueue", 0);//thumbQueue = dispatch_queue_t
NSFileManager *fm = [NSFileManager defaultManager];
//good idea to check for previous thumb cache with NSFileManager here
CGSize thumbSize = CGSizeMake(THUMB_SIZE);
__block CGPDFPageRef myPageRef;
NSString *reqSysVer = @"4.0";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
//need to handle ios versions < 4
if ([currSysVer compare:reqSysVer options:NSNumericSearch] == NSOrderedAscending) {NSLog(@"UIKIT MULTITHREADING NOT SUPPORTED!");return;}//thread/api saftey
dispatch_async(thumbQueue, ^{
for (i=1; i<=_maxPages; i++) {
//check if worker is valid (class member bool) for cancelations
myPageRef=[[PDFDocument sharedPDFDocument]getPageData:i];//pdfdocument is a singleton class
if(!myPageRef)return;
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString* imageName = [NSString stringWithFormat:@"%@thumb%i.png",documentName,i];
NSString* fullPathToFile = [thumbDocPath stringByAppendingPathComponent:imageName];
if(![fm fileExistsAtPath:fullPathToFile]){
//NSLog(@"Not there");
UIGraphicsBeginImageContext(thumbSize);//thread Safe in iOs4
CGContextRef context = UIGraphicsGetCurrentContext();//thread Safe in iOs4
CGContextTranslateCTM(context, 0, 144);
CGContextScaleCTM(context, 0.15, -0.15);
CGContextDrawPDFPage (context, myPageRef);
UIImage * render = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData* imageData= UIImagePNGRepresentation(render);
if(imageData){
NSLog(@"WROTE TO:%@",fullPathToFile);
if(![imageData writeToFile:fullPathToFile atomically:NO])NSLog(@"ERROR: Thumb Didnt Save"); //COMMENT OUT TO DISABLE WRITE
}
}
else NSLog(@"Allready There! %@",fullPathToFile);
//update progress on thumb viewController if you wish here
[pool release];
dispatch_sync(dispatch_get_main_queue(), ^{
[self drawImageView:i];
});
}
});
dispatch_release(thumbQueue);
}