Как я могу отобразить PDF на весь экран на iPad? - PullRequest
4 голосов
/ 27 декабря 2010

Я приложил фрагмент кода, который я использую для отображения PDF.Следующий код отображает PDF, но кажется, что он либо сжат, либо не использует полный размер дисплея iPad, что приводит к слишком маленькой странице.

Как отобразить PDF, который подходитграница дисплея iPad или в увеличенном состоянии?Я попытался использовать другой подход (подход-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 ]

1 голос
/ 18 июля 2011

Надеюсь, это поможет. Он показывает, как отобразить первую страницу PDF, на которую ссылается URL.

Этот код представляет собой набор фрагментов моей собственной кодовой базы, поэтому не просто скопируйте его, вставьте в 1 файл и ожидайте, что он будет собран и запущен. Я добавил несколько комментариев, чтобы вы увидели, что и где принадлежит, и вам нужно будет объявить несколько иваров, чтобы они работали.

// 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);
0 голосов
/ 05 сентября 2013

Это отобразит ваш 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 - "ТЕСТ": вы хотите назвать свое имя именем вашего файла

Это работает для меня, чтобы отобразить PDF на весь экран в UIView,

Я не уверен, что это ваш лучший вариант: есть проблемы: вам нужно обрабатывать масштабирование, а если вы делаете это, вам нужно обрабатывать панорамирование. Ориентация также представляет собой большую неразбериху (когда вы переворачиваете устройство в альбомный режим), файл теряет свое соотношение сторон (и становится сжатым)

Сыграйте с ним в раунд .....

Хотя переход на обработку PDF в IOS - не что иное, как боль. , , .

Надеюсь, это поможет вам немного

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...