iPadでPDF

今更という感じもあるけど、今回はiPadiPhoneでPDFを表示するときの注意点を書いておく。
PDFを表示するためには CGPDF系のAPIを使うことになるんだけど、UIVIewのdrawRectに

    CGPDFPageRef page = CGPDFDocumentGetPage(pdfDocument, pageNumber);
    CGContextDrawPDFPage(context, page);
    CGPDFPageRelease(page);

でできる(かなり省略してるが)。ただ注意しないといけないのは、これを繰り返すとアプリが落ちることだ。
おそらくメモり不足だと思うが、CGPDFPageRelease がうまく動いていないようだ。

    CGDocumentRelese(pdfDocument)

でメモリ解放してくれてるようなので、CGPDFPageRef が返ってくる関数は最小限で押さえた方が良さそうだ。


ちなみに・・・、CGContextDrawPDFPage では座標系が異なるので、あわせてあげないと上下反転していたり、表示されなかったりするのでこれも注意しないといけない。まぁ、次のようにしておけば、全画面表示になる。

- (void) drawRect:(CGRect)rect {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGRect r = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
    CGFloat rw = rect.size.width / r.size.width;
    CGFloat rh = rect.size.height / r.size.height;
    CGContextTranslateCTM(ctx, 0, rect.size.height);
    CGContextScaleCTM(ctx, rw, -rh);
    CGContextDrawPDFPage(ctx, page);
}