Эффективное создание эскизов для файлов PDF, таких как iBooks - PullRequest
2 голосов
/ 16 февраля 2011

Как iBooks может так быстро создавать эскизы страниц PDF при первой загрузке? Я попытался использовать функции CGContext, чтобы нарисовать страницу, а затем изменить ее размер, чтобы получить эскиз. Но этот подход длится долго. Есть ли эффективный способ получить миниатюры страниц PDF?

Спасибо заранее, Anupam

Ответы [ 2 ]

0 голосов
/ 18 января 2013

Отказ от ответственности : я не проверял, быстрее это или нет.


В ImageIO есть несколько встроенных методов, которые специализируются на создании эскизов.Эти методы должны быть оптимизированы для создания миниатюр.Вам нужно добавить ImageIO.framework в ваш проект и #import <ImageIO/ImageIO.h> в вашем коде.

// Get PDF-data
NSData *pdfData = [NSData dataWithContentsOfURL:myFileURL];

// Get reference to the source
// NOTE: You are responsible for releasing the created image source
CGImageSourceRef imageSourceRef = CGImageSourceCreateWithData((__bridge CFDataRef)pdfData, NULL);

// Configure how to create the thumbnail
// NOTE: You should change the thumbnail size depending on how large thumbnails you need.
// 512 pixels is probably way too big. Smaller sizes will be faster.
NSDictionary* thumbnailOptions = 
    @{(id)kCGImageSourceCreateThumbnailWithTransform: (id)kCFBooleanTrue,
      (id)kCGImageSourceCreateThumbnailFromImageIfAbsent: (id)kCFBooleanTrue,
      (id)kCGImageSourceThumbnailMaxPixelSize: @512}; // no more than 512 px wide or high

// Create thumbnail
// NOTE: You are responsible for releasing the created image
CGImageRef imageRef = 
    CGImageSourceCreateThumbnailAtIndex(imageSourceRef,
                                        0, // index 0 of the source
                                        (__bridge CFDictionaryRef)thumbnailOptions);

// Do something with the thumbnail ...

// Release the imageRef and imageSourceRef
CGImageRelease (imageRef);
CFRelease(imageSourceRef);
0 голосов
/ 18 января 2013

Сначала получите все ваши PDF-файлы Путь в массиве [здесь т.е.: pdfs]. Затем, если вы хотите показать все эти миниатюры PDF в UICollectionView, просто передайте индекс, полученный из представления коллекции Метод делегата "CellForRowAtIndexPath", в следующую

-(UIImage *)GeneratingIcon:(int)index
{
    NSURL* pdfFileUrl = [NSURL fileURLWithPath:[pdfs objectAtIndex:index]];
    CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((__bridge CFURLRef)pdfFileUrl);
    CGPDFPageRef page;

    CGRect aRect = CGRectMake(0, 0, 102, 141); // thumbnail size
    UIGraphicsBeginImageContext(aRect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    UIImage* IconImage;
    CGContextSaveGState(context);
    CGContextTranslateCTM(context, 0.0, aRect.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    CGContextSetGrayFillColor(context, 1.0, 1.0);
    CGContextFillRect(context, aRect);

    // Grab the first PDF page
    page = CGPDFDocumentGetPage(pdf, 1);
    CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(page, kCGPDFMediaBox, aRect, 0, true);
    // And apply the transform.
    CGContextConcatCTM(context, pdfTransform);

    CGContextDrawPDFPage(context, page);

    // Create the new UIImage from the context
    IconImage = UIGraphicsGetImageFromCurrentImageContext();

    CGContextRestoreGState(context);

    UIGraphicsEndImageContext();
    CGPDFDocumentRelease(pdf);

    return IconImage;
}

Надеюсь, это будет достаточно быстро для создания миниатюр изображений для PDF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...