渲染 PDF iOS-iPad- Quartz 的问题

Posted

技术标签:

【中文标题】渲染 PDF iOS-iPad- Quartz 的问题【英文标题】:Problem with rendering PDF iOS-iPad- Quartz 【发布时间】:2011-04-08 14:25:40 【问题描述】:

我在将 pdf 渲染到 UIScroolView 时遇到问题。当我在横向模式下启动我的应用程序时,pdf 被填充到视图宽度范围,但没有填充到视图高度范围。 pdf 内容进入屏幕,但出现 UIScroolView 栏,并且在 pdf 内容下方我有一个白色区域。但是当我以纵向模式启动我的应用程序时,我没有任何问题,因为 pdf 已填充到视图边界(宽度和高度)。

scoolView 具有以下属性:

theScrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
theScrollView.contentSize = self.view.bounds.size;

呈现pdf的方法是这样的:

- (void)drawLayer:(CATiledLayer *)layer inContext:(CGContextRef)context

CGPDFPageRef drawPDFPageRef = NULL;
CGPDFDocumentRef drawPDFDocRef = NULL;

@synchronized(self) // Briefly block main thread

    drawPDFDocRef = CGPDFDocumentRetain(_PDFDocRef);
    drawPDFPageRef = CGPDFPageRetain(_PDFPageRef);


CGContextSetRGBFillColor(context, 1.0f, 1.0f, 1.0f, 1.0f);
CGContextFillRect(context, CGContextGetClipBoundingBox(context));

if (drawPDFPageRef != NULL) // Render the page into the context

    NSLog(@"DRAW LAYER: drawPDFPageRef != NULL ");

    CGFloat boundsHeight = self.bounds.size.height;

    if (CGPDFPageGetRotationAngle(drawPDFPageRef) == 0)
    
        NSLog(@"DRAW LAYER: CGPDFPageGetRotationAngle(drawPDFPageRef) == 0");
        CGFloat boundsWidth = self.bounds.size.width;

        CGRect cropBoxRect = CGPDFPageGetBoxRect(drawPDFPageRef, kCGPDFCropBox);
        CGRect mediaBoxRect = CGPDFPageGetBoxRect(drawPDFPageRef, kCGPDFMediaBox);
        CGRect effectiveRect = CGRectIntersection(cropBoxRect, mediaBoxRect);

        CGFloat effectiveWidth = effectiveRect.size.width;
        CGFloat effectiveHeight = effectiveRect.size.height;

        CGFloat widthScale = (boundsWidth / effectiveWidth);
        CGFloat heightScale = (boundsHeight / effectiveHeight);

        CGFloat scale = (widthScale < heightScale) ? widthScale : heightScale;

        CGFloat x_offset = ((boundsWidth - (effectiveWidth * scale)) / 2.0f);
        CGFloat y_offset = ((boundsHeight - (effectiveHeight * scale)) / 2.0f);

        y_offset = (boundsHeight - y_offset); // Co-ordinate system adjust

        CGFloat x_translate = (x_offset - effectiveRect.origin.x);
        CGFloat y_translate = (y_offset + effectiveRect.origin.y);

        CGContextTranslateCTM(context, x_translate, y_translate);

        CGContextScaleCTM(context, scale, -scale); // Mirror Y
    
    else // Use CGPDFPageGetDrawingTransform for pages with rotation (AKA kludge)
    
        NSLog(@"DRAW LAYER ELSE : CGPDFPageGetRotationAngle(drawPDFPageRef) == 0");

        CGContextTranslateCTM(context, 0.0f, boundsHeight);
        CGContextScaleCTM(context, 1.0f, -1.0f);

        CGContextConcatCTM(context, CGPDFPageGetDrawingTransform(drawPDFPageRef, kCGPDFCropBox, self.bounds, 0, true));
    

    CGContextDrawPDFPage(context, drawPDFPageRef);


CGPDFPageRelease(drawPDFPageRef); // Cleanup
CGPDFDocumentRelease(drawPDFDocRef);

非常感谢!!

【问题讨论】:

关于 PDF 页面的显示,我推荐这篇博文:ipdfdev.com/2011/03/23/…,它展示了如何使用页面裁剪框和旋转来正确显示任何 PDF 页面。 【参考方案1】:

我已经解决了我的问题,只需添加

theScrollView.contentSize= self.view.bounds.size

在 DidRotateFromInterfaceOrientation 中

【讨论】:

以上是关于渲染 PDF iOS-iPad- Quartz 的问题的主要内容,如果未能解决你的问题,请参考以下文章

Quartz 2D 绘制不同颜色的 PDF 页面

使用 Quartz 在 iOS 上获取 PDF 超链接

使用 Quartz 2D 解析 pdf 时获取文本位置

iOS-iPad强制竖屏

Quartz-2D

带有 Quartz 作业的 XSL 样式表路径