iOS版PDFKitでメモリ消費を押さえながらサムネイルを生成する

概要

iOS版PDFKitではPDFPageクラスにサムネイル生成用のメソッドthumbnailOfSize:が用意されている。このメソッドを使用して全ページのサムネイル画像を生成していくと、PDFによってはメモリ消費量がどんどん増加していき、アプリがクラッシュする。

解決策

サムネイル生成のために使用されたメモリはPDFPageの元になったPDFDocumentを解放することで抑えることができる。そこでサムネイル生成のためにPDFDocumentを新たに生成し、終わったら解放するようにする。

サンプルコード

NSString* pdfFilePath = @"file path of PDF file";
PDFDocument* pdfDocument = [[PDFDocument alloc] initWithURL:[NSURL fileURLWithPath:pdfFilePath]];  // A) 
NSUInteger pageCount = pdfDocument.pageCount;

for(int pageIndex = 0; pageIndex < pageCount; pageIndex++) {
    @autoreleasepool {  // C)
        PDFDocument* _pdfDocument = [[PDFDocument alloc] initWithURL:[NSURL fileURLWithPath:pdfFilePath]];  // B)
        PDFPage *pdfPage = [_pdfDocument pageAtIndex:pageIndex];
        UIImage *thumbnailImg = [pdfPage thumbnailOfSize:CGSizeMake(50, 50) forBox:kPDFDisplayBoxCropBox];
        //  do something
    }
}

A) PDF表示のために使用するメインのPDFDocument。通常はクラスプロパティなどで保持する。

B) サムネイル生成のためだけに使用するPDFDocument。生成処理が終わったら@autoreleasepoolですぐに解放する。

C) サムネイル生成のために使用したPDFDocumentインスタンスを解放するために必要。