如何在iPad上显示PDF全屏?

时间:2010-12-27 13:13:39

标签: ipad pdf

我附上了用于显示PDF的代码段。以下代码显示PDF,但似乎是使用iPad显示器的全尺寸挤压或不使用,导致页面太小。

如何显示适合iPad显示边界或缩放状态的PDF?我尝试过使用不同的方法(方法2),但是它会产生一个问题,即PDF以90度的角度旋转。

方法-1:

CGContextSaveGState(ctx);

CGContextTranslateCTM(ctx, 0.0, [self.view bounds].size.height);
CGContextScaleCTM(ctx, 1.0, -1.0);
CGContextConcatCTM(ctx, 
                   CGPDFPageGetDrawingTransform(page, kCGPDFCropBox, 
                                                [self.view bounds], 0, true));

CGContextDrawPDFPage(ctx, page);    
CGContextRestoreGState(ctx);

方法-2:

CGPDFPageRef page = CGPDFDocumentGetPage(pdfdocument, PageNo+1);
if(page){
    CFRetain(page);
}
CGRect pageRect =CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
int angle= CGPDFPageGetRotationAngle(page);
float pdfScale = self.bounds.size.width/pageRect.size.width;
CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
CGContextFillRect(context,self.bounds);
CGContextSaveGState(context);
// Flip the context so that the PDF page is rendered
// right side up.
CGContextTranslateCTM(context, 0.0, self.bounds.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

// Scale the context so that the PDF page is rendered 
// at the correct size for the zoom level.
CGContextScaleCTM(context, pdfScale,pdfScale);  
CGContextDrawPDFPage(context, page);
CGContextRestoreGState(context);

任何人都可以向我推荐一个解决方案,允许任何大小和任意角度的PDF在两个方向上全屏显示在iPad上吗?如果您能为我提供代码片段或伪代码,那就太好了。 感谢

2 个答案:

答案 0 :(得分:1)

希望这会有所帮助。它显示了如何呈现URL引用的PDF的第一页。

此代码是我自己的代码库的片段集合,所以不要只是将其粘贴到1个文件中并期望它构建和运行。我发表了一些评论,以便您了解哪些属于哪里,并且您需要声明一些ivars才能正常工作。

// helper function
CGRect CGRectScaleAspectFit(CGRect sourceRect,CGRect fitRect)
{
    if ( sourceRect.size.width > fitRect.size.width)
    {
        float scale = fitRect.size.width / sourceRect.size.width;
        sourceRect.size.width = fitRect.size.width;
        sourceRect.size.height = (int)(sourceRect.size.height * scale);
    }

    if ( sourceRect.size.height > fitRect.size.height)
    {
        float scale = fitRect.size.height / sourceRect.size.height;
        sourceRect.size.height = fitRect.size.height;
        sourceRect.size.width = (int)(sourceRect.size.width * scale);
    }

    return sourceRect;
}


// in your UIView subclass init method

    CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL);
    pdfPage = CGPDFDocumentGetPage(pdf, 1);

    CGRect fitrect = CGRectMake(0, 0, self.frame.size.width,self.frame.size.height);
    CGRect pageRect = CGPDFPageGetBoxRect(pdfPage, kCGPDFMediaBox);

    CGRect f;

    f.origin.x=0;
    f.origin.y=0;

    f.size.height = self.frame.size.height;
    f.size.width = self.frame.size.height * pageRect.size.width/pageRect.size.height;

    f = CGRectScaleAspectFit(f,fitrect); // this is the actual pdf frame rectangle to fill the screen as much as possible
    pdfScale = f.size.height/pageRect.size.height;


// in your UIView subclass drawRect method

    CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
    CGContextFillRect(context,self.bounds);

    CGContextSaveGState(context);

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

    CGContextScaleCTM(context, pdfScale,pdfScale);  
    CGContextDrawPDFPage(context, pdfPage);
    CGContextRestoreGState(context);

答案 1 :(得分:0)

这将显示您的PDF全屏:不确定这是处理PDF的最佳方式

- (void)drawRect:(CGRect)rect
{
  CGContextRef ctx = UIGraphicsGetCurrentContext();

  //PDF might be transparent, assume white paper - set White Background
  [[UIColor whiteColor] set];
  CGContextFillRect(ctx, rect);

  //Flip coordinates
  CGContextGetCTM(ctx);
  CGContextScaleCTM(ctx, 1, -1);
  CGContextTranslateCTM(ctx, 0, -rect.size.height);

  //PDF File Path
  NSURL *pdfURL = [[NSBundle mainBundle] URLForResource:@"TEST" withExtension:@"pdf"];
  CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((__bridge CFURLRef)pdfURL);
  CGPDFPageRef page1 = CGPDFDocumentGetPage(pdf, 1);

  //Get the rectangle of the cropped inside
  CGRect mediaRect = CGPDFPageGetBoxRect(page1, kCGPDFCropBox);
  CGContextScaleCTM(ctx, rect.size.width / mediaRect.size.width,
              rect.size.height / mediaRect.size.height);

  //Draw PDF
  CGContextDrawPDFPage(ctx, page1);
  CGPDFDocumentRelease(pdf);
}

将要显示的PDF复制到项目库中, 在上面的例子中,PDF文件的名称是“TEST”:你想用你的文件名命名你的

这适用于我在UIView中全屏显示PDF,

我不确定这是你最好的选择:有问题:即你需要处理缩放,如果你这样做,你需要处理平移。方向也是一个很大的混乱(当你将设备翻转到横向模式时)文件失去了它的Aspect Ration(并且被压扁了)

用它玩一轮......

尽管在IOS中加入PDF处理只不过是一种痛苦。 。 。

希望这能帮到你一点