概要
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
インスタンスを解放するために必要。