【问题标题】:how to fit pdf page in entire view如何使pdf页面适合整个视图
【发布时间】:2010-12-01 06:06:15
【问题描述】:

我读了pdf文件也显示出来了,代码是这样的:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx

{

NSLog(@"the layer  height %d, %d,%d ,%d",layer.bounds.size.width,layer.bounds.size.height,layer.bounds.origin.x,layer.bounds.origin.y);


int c=[currentPage intValue]+1;
NSLog(@"drawing started");



if(UIInterfaceOrientationIsPortrait([self interfaceOrientation])){
    layer.backgroundColor=[UIColor blackColor];
    myPageRef = CGPDFDocumentGetPage(myDocumentRef, c);

    NSLog(@"draw layer");
    CGSize pageSize = [kbDataSource pageSize];
    GLogInfo(@"the page ize we are getting in draw layer is %@ ",NSStringFromCGSize(pageSize));
    //CGContextSaveGState(ctx);

    CGSize aspectFitSize = [self getPageFitSizeOfSize:pageSize inSize:CGSizeMake(self.view.bounds.size.width, self.view.bounds.size.height- __TOP_BRANDING_BAR_HEIGHT)];
    CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0);
    CGContextFillRect(ctx, CGContextGetClipBoundingBox(ctx));



    GLogDebug(@"aspect fitsize of image to %@", NSStringFromCGSize(aspectFitSize));
    NSLog(@"layer bounds are:%@  %@ ",NSStringFromCGSize(layer.bounds.size),NSStringFromCGPoint(layer.bounds.origin));
    NSLog(@"page size of the book is:%@",NSStringFromCGSize(pageSize));
    CGFloat aspectRatio=pageSize.width/pageSize.height;
/*  
    if (aspectRatio>0.5 && aspectRatio<=0.74) {
        NSLog(@"aspect ratio is between 0.5 and 0.74");
        CGContextTranslateCTM(ctx,-110 ,layer.bounds.size.height+100);
        CGContextScaleCTM(ctx, 1.28,-1.22);
    }
    else
        if (aspectRatio>0.74 && aspectRatio<1) {
            NSLog(@"aspect ratio is between 0.75 and 1");
            //CGContextTranslateCTM(ctx, -145,layer.bounds.size.height+85);
            //CGContextScaleCTM(ctx, 1.4,-1.2);
            CGContextTranslateCTM(ctx, -130,layer.bounds.size.height+75);
            CGContextScaleCTM(ctx, 1.35,-1.18);

        }
        else if(aspectRatio>1) {
            NSLog(@"aspect ratio is above 1");
            CGContextTranslateCTM(ctx,-80,layer.bounds.size.height+80);
            CGContextScaleCTM(ctx, 1.2,-1.2);
        }
        else {
            CGContextTranslateCTM(ctx, 0, layer.bounds.size.height);
            CGContextScaleCTM(ctx, 1.0, -1.0);
        }*/


/*  
    CGFloat scalingRatio;


    if ((layer.bounds.size.width/pageSize.width)<((layer.bounds.size.height-41)/pageSize.height)){

     scalingRatio=layer.bounds.size.width/pageSize.width;

    }
    else {
        scalingRatio=(layer.bounds.size.height-41)/pageSize.height;
    }

    */
    CGRect cropBox = CGPDFPageGetBoxRect(myPageRef, kCGPDFCropBox);
    CGRect targetRect = layer.bounds;
    CGFloat xScale = targetRect.size.width / cropBox.size.width;
    CGFloat yScale = (targetRect.size.height-41) / cropBox.size.height;
    CGFloat scaleToApply = (xScale < yScale) ? xScale : yScale;

    CGContextTranslateCTM(ctx, 0.0, -41+layer.bounds.size.height);
    CGContextScaleCTM(ctx, 1.0, -1.0);
    NSLog(@"the crop box values are %@",NSStringFromCGRect(cropBox));
    NSLog(@"the crop box values are %f",cropBox.origin.x);

    NSLog(@"the scaleToApply is %f",scaleToApply);
    NSLog(@"the view bounds are %@",[self.view description]);

    if (scaleToApply == yScale)
        CGContextConcatCTM(ctx, CGAffineTransformMakeTranslation(-100, -150));
    else
        CGContextConcatCTM(ctx, CGAffineTransformMakeTranslation(-180, -260)); //evans
    CGContextConcatCTM(ctx, CGAffineTransformMakeScale(scaleToApply, scaleToApply));
    CGContextConcatCTM(ctx, CGPDFPageGetDrawingTransform(myPageRef, kCGPDFCropBox, layer.bounds, 0, true));
    //
    //CGContextConcatCTM(ctx, CGAffineTransformMakeScale(scaleToApply, scaleToApply));


    CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); 
    CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
    CGContextDrawPDFPage(ctx, myPageRef);
    //CGContextRestoreGState(ctx);

    [loadingIndicator stopAnimating];
    [loadingIndicator1 stopAnimating];
    [loadingIndicator2 stopAnimating];

}

它可以准确地读取和显示 pdf,但问题是,它不适合每个 pdf 的整个视图,我的代码中是否需要修改或更正。请发表一些建议和 cmets。谢谢!!!

【问题讨论】:

标签: iphone ipad pdf sqlite nsxmlparser


【解决方案1】:

您需要计算页面所需的比例值以适合您的视图。然后将正确的值放入您的

CGContextScaleCTM(ctx, 1.0, -1.0);

打电话。

【讨论】:

  • @ajay,您是否能够编写方法来计算在两种方向模式下都有效的比例值?如果是这样,您能否将其作为更新发布在您的问题中?谢谢!
  • @Flash84x 它通常是您的页面尺寸与您要显示它的视图/框架尺寸的比率,其中 100% = 1.0。应该很容易计算。
  • 是的,这是一个我已经计算出来的简单计算,但由于我还不完全理解的原因,将该比例值传递给 CGContextScaleCTM(ctx, scale, -scale); 会导致一些不希望的结果。我不得不使用CGContextConcatCTM(ctx, CGAffineTransformMakeScale(scale, scale));
  • 大家好,我修改了一些代码,你能给我更多信息吗。stackoverflow.com/questions/4634331/…
猜你喜欢
  • 2018-12-04
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
相关资源
最近更新 更多