PDF для создания изображений в IOS - PullRequest
1 голос
/ 28 декабря 2011

Привет всем. Я пытаюсь создать PNG-изображения (миниатюры) из pdf для своего приложения, для этого я использовал пару ответов из стека overflow, приведенный ниже, код, который я использую `-

- (Недействительными) pdfToImageConverter {

NSURL* pdfFileUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"ebook" ofType:@"pdf"]];
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfFileUrl);
CGPDFPageRef page;

CGRect aRect = CGRectMake(0, 0, 100, 200); // thumbnail size


NSUInteger totalNum = CGPDFDocumentGetNumberOfPages(pdf);

for(int i = 0; i < totalNum; i++ ) {
    CGPDFPageRef myPageRef=CGPDFDocumentGetPage(pdf, i+1);
     aRect=CGPDFPageGetBoxRect(myPageRef, kCGPDFCropBox);
    UIGraphicsBeginImageContext(CGSizeMake(383, 383*(aRect.size.height/aRect.size.width)));
    CGContextRef context = UIGraphicsGetCurrentContext();
    UIImage* thumbnailImage;
    //thumbnailImage=[[UIImage alloc] init];
    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  PDF page
    page = CGPDFDocumentGetPage(pdf, i + 1);
    CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(page, kCGPDFMediaBox, aRect, 0, true);
    // And apply the transform.
    CGContextConcatCTM(context, pdfTransform);
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
    CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);
    CGContextDrawPDFPage(context, page);

    // Create the new UIImage from the context
    thumbnailImage = [UIGraphicsGetImageFromCurrentImageContext() retain];

    //Use thumbnailImage (e.g. drawing, saving it to a file, etc)

    CGContextRestoreGState(context);
    NSString *documentsPath=[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingFormat:@"/page_%d.png",i+1];
    NSData *imagedata;//=[[NSData alloc] init];
    imagedata=[UIImagePNGRepresentation(thumbnailImage) retain];
    [thumbnailImage release];
    [imagedata writeToFile:documentsPath atomically:YES];
    [imagedata release];
    UIGraphicsEndImageContext();   


}
CGPDFDocumentRelease(pdf);
UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"message" message:@"images creation completed" delegate:self cancelButtonTitle:@"ok" otherButtonTitles: nil];
[alert show];
[alert release];

} `

* Проблема: * Вышеупомянутый код хорошо работает в симуляторе и работает в устройстве для создания некоторых изображений (до 30 миниатюр). Я использовал анализатор для проверки утечек памяти, но выше нет утечек код, но я все еще не могу создать все миниатюры. Я использую ebook.pdf (300 МБ), который содержит 1037 страниц. Поэтому мне нужно 1037 миниатюр.

* Вопрос: *

1. Есть ли проблемы с кодом?

2.Какую ошибку я делаю в приведенном выше блоке кода?

3. Есть ли другой механизм для создания изображений в формате png из PDF?

Заранее спасибо, ваши предложения важнее для меня.

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Цикл для тысячи страниц означает, что вы выделяете память для каждого процесса страницы, и этот кусок памяти никогда не используется повторно до завершения метода. Управление памятью Obj-C работает таким образом, с эффективным освобождением памяти после каждого цикла.

Если вы хотите повторно использовать память для каждой итерации, используйте независимый NSAutoreleasePool

for(int i = 0; i < totalNum; i++ ) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    ... .... (process page ... ) ...
    [pool release];
}

Или, если вы используете ARC:

for(int i = 0; i < totalNum; i++) {
    @autoreleasePool {
        .... (... process page ... ) ....
    }
}
1 голос
/ 16 июля 2012

Проверьте этот проект с открытым исходным кодом; они неплохо справляются с рендерингом PDF в UIImage. https://github.com/mindbrix/UIImage-PDF

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