3

PDFページを読むための次のコードがあります。問題は、計測器が分析するページを読むたびに、 CFData (ストア)
が約 1MB 増加することです。どんな助けでも大歓迎です。

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context;

context = CGBitmapContextCreate(NULL, 
                                    width, 
                                    height, 
                                    8,
                                    width* 4,
                                    colorSpace, 
                                    kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextClipToRect(context, CGRectMake(0, 0, pageSize.width*2, pageSize.height*2));

CGContextSaveGState(context);
CGPDFPageRef page = CGPDFDocumentGetPage(pdf, index + 1);
CGRect rect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
CGRect rectClip = CGContextGetClipBoundingBox(context);
CGAffineTransform transform = aspectFit(rect,rectClip);
CGContextConcatCTM(context, transform);
CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);
CGContextDrawPDFPage(context, page);
CGContextRestoreGState(context);

CGImageRef image = CGBitmapContextCreateImage(context);
CGContextRelease(context);

UIImage *img = [UIImage imageWithCGImage:image];
CGImageRelease(image);
4

2 に答える 2

2

私は同じ問題を抱えていて、答えを探しているときにあなたの質問を見つけました。

私の場合、pdfページをjpegに変換してからディスクに保存していました。私の問題は、CGPDFDocumentRef と CFURLRef の所有権と解放にあったようです。

_bridge キャストを使用するとNSURL *pdfURL、問題が修正されました。
この回答は、ブリッジされたキャストを説明するのに適していると思いました: ARC とブリッジされたキャスト

XCode の Analyze ツールは、このような状況で非常に役立ちます。

- (void) drawRect:(CGRect)rect {
    NSURL *pdfURL = [NSURL fileURLWithPath:self.filePath];

    CGPDFDocumentRef document = CGPDFDocumentCreateWithURL((__bridge CFURLRef)pdfURL); 

    for (int i = 1; i <= (int)CGPDFDocumentGetNumberOfPages(document); ++i){
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
        CGContextClearRect(context, self.bounds);
        CGContextFillRect(context, self.bounds);

        CGPDFPageRef pageRef = CGPDFDocumentGetPage(document, i);

        CGRect pageRect = CGPDFPageGetBoxRect(pageRef, kCGPDFMediaBox);

        CGFloat scale = MIN(self.bounds.size.width / pageRect.size.width, self.bounds.size.height / pageRect.size.height);

        CGContextSaveGState(context);
        CGContextTranslateCTM(context, 0.0, self.bounds.size.height);
        CGContextScaleCTM(context, 1.0, -1.0);
        CGContextScaleCTM(context, scale, scale);

        CGContextSetInterpolationQuality(context, kCGInterpolationLow);
        CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);
        CGContextDrawPDFPage(context, pageRef);

        CGContextRestoreGState(context);

        CGImageRef image = CGBitmapContextCreateImage(context);

        NSString  *jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/%@_%i.jpg", self.sourceId, i]];
        [UIImageJPEGRepresentation([UIImage imageWithCGImage:image], 1) writeToFile:jpgPath atomically:YES];

        CGImageRelease(image);
    }

    CGPDFDocumentRelease(document);
}

これが誰かを助けることを願っています!
ケビン

于 2013-04-22T18:29:17.940 に答える
2

長い追跡の後、私はそれを使い終わった後にPDF文書を閉じなかったことが問題であることがわかりました

CGPDFDocumentRelease(pdfDoc);  

そうでない場合は、割り当てられたすべてのページを問題内に保持します

于 2013-04-23T07:05:29.577 に答える