2

我的应用程序采用 PDF 并为给定数量的页面生成缩略图。

在 OS X 10.7 上一切正常

在 OS X 10.8 上,在某些页面上,在某些 PDF 上(在 1400 测试中,计数是 7 个文档,其中有一个“违规”页面)它无法呈现,导致调用CGContextDrawPDFPage时出现 EXC_BAD_ACCESS

有时(1 比 10)它会成功。但 90% 的情况下,该文档上的该页面会导致崩溃。

下面发布的相关代码在循环中重复每个pageNumber以呈现所提供的pdfDocument。每次迭代都会产生一个CGImageRef imgRef ,它被保存到一个数组中供以后使用。


假设崩溃发生在第 30 页。

如果我从 28 渲染到 38 就可以了。

如果我从 27 渲染到 37 崩溃。

如果我只渲染 30 总是可以的。

某些包含有问题的页面集会崩溃。其他的不要。


这似乎是 PDFKit 10.8 中的一个错误......(当被要求渲染同一文档的多个页面时,尝试做一些内部缓存优化时搞砸了?)

当然,我不能排除代码中的错误,但这似乎不太可能。

任何有关如何解决此问题的想法将不胜感激。

    CGPDFPageRef     pdfPage      =   CGPDFDocumentGetPage 
                                            ( pdfDocument,
                                              pageNumber );

    if( !pdfPage ) return;

    CGPDFPageRetain(pdfPage);

    CGRect          rect          =   CGPDFPageGetBoxRect
                                            ( pdfPage,
                                              kCGPDFCropBox);

    CGColorSpaceRef imgColorSpace =   CGColorSpaceCreateDeviceRGB ( );

    CGContextRef    contextRef    =   CGBitmapContextCreate
                                            ( NULL,
                                              (size_t) (rect.size.width),
                                              (size_t) (rect.size.height),
                                              8,
                                              ((size_t) (rect.size.width))*4,
                                              imgColorSpace,
                                              kCGImageAlphaPremultipliedLast );

    CGColorSpaceRelease ( imgColorSpace );
    if( !contextRef ) return;

    CGContextDrawPDFPage ( contextRef, pdfPage ); // <==== EXC_BAD_ACCESS

    CGImageRef      imgRef        =   CGBitmapContextCreateImage
                                            ( contextRef );

    CFRelease ( contextRef );

    CGPDFPageRelease( pdfPage );
4

1 回答 1

0

这是 OS X 10.8 中引入的 PDFKit 的一个 bug

该错误已在 OS X 10.9 中修复

于 2014-01-22T17:26:36.597 回答