Есть ли способ программно прокрутить страницу PDF в UIWebView? - PullRequest
9 голосов
/ 18 декабря 2009

Можно использовать JavaScript, чтобы установить смещение y по пикселам UIWebView, например ::

[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"scrollTo(0, %d)", offset]];

Так есть ли способ получить:

  1. Высота пикселя отдельной страницы PDF в веб-представлении?
  2. Размер разрыва между страницами?

Доступна ли эта информация из UIWebView или она может быть рассчитана альтернативными способами?

Я думаю, что если у меня есть количество страниц (через CGPDFDocumentGetNumberOfPages), разрыв в пикселях по высоте между страницами или высота в пикселях отдельной страницы, я могу вычислить offset использовать с вызовом JavaScript. Затем я просто подключаю UIButton или UISlider для перемещения между страницами.


РЕДАКТИРОВАТЬ I

У меня есть решение, но оно использует UIWebDocumentView, частное подпредставление UIWebView.

Я создаю контроллер представления с именем PDFViewerViewController, который является подклассом WebViewerViewController, который сам является контроллером представления, который содержит UIToolbar, UIWebView и соответствует протоколу UIWebViewDelegate.

My PDFViewerViewController вычисляет некоторую информацию о вложенном веб-представлении и данных PDF после вызова метода делегата веб-представления -webViewDidFinishLoad:.

Эта информация используется для расчета приблизительного смещения на страницу, которое передается в веб-представление с помощью JavaScript.

PDFViewerViewController.h

#import <UIKit/UIKit.h>
#import "WebViewerViewController.h"

@interface UIWebDocumentView : NSObject {}
@end

@interface PDFViewerViewController : WebViewerViewController {
    NSUInteger offset;
    NSUInteger currentPage;
    NSUInteger documentPages;
    CGFloat documentHeight;
    CGFloat pageHeight;
}

@property (assign) NSUInteger offset;
@property (assign) NSUInteger currentPage;
@property (assign) NSUInteger documentPages;
@property (assign) CGFloat documentHeight;
@property (assign) CGFloat pageHeight;

@end

PDFViewerViewController.m

#import "PDFViewerViewController.h"

@implementation PDFViewerViewController

@synthesize offset;
@synthesize currentPage;
@synthesize documentPages;
@synthesize documentHeight;
@synthesize pageHeight;

- (void) viewDidLoad {
    [super viewDidLoad];

    UIBarButtonItem *_leftArrow = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"ArrowLeft.png"] style:UIBarButtonItemStylePlain target:self action:@selector(leftArrow:)];
    UIBarButtonItem *_flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
    UIBarButtonItem *_rightArrow = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"ArrowRight.png"] style:UIBarButtonItemStylePlain target:self action:@selector(rightArrow:)];
    [[super.viewerToolbarView toolbar] setItems:[NSArray arrayWithObjects:_leftArrow, _flexibleSpace, _rightArrow, nil]];
    [_leftArrow release];
    [_flexibleSpace release];
    [_rightArrow release];

    self.currentPage = 0;
}

- (void) webViewDidFinishLoad:(UIWebView *)_webView {
    for (UIView *_subview in [[[_webView subviews] objectAtIndex:0] subviews]) {
        if ([_subview isKindOfClass:[UIWebDocumentView class]]) {
            self.documentHeight = _subview.bounds.size.height;
        }
    }

    CGPDFDocumentRef pdfDocument = CGPDFDocumentCreateWithURL((CFURLRef)baseURL);
    self.documentPages = CGPDFDocumentGetNumberOfPages(pdfDocument);
    CGPDFDocumentRelease(pdfDocument);

    self.pageHeight = (self.documentHeight + (10 * self.documentPages)) / self.documentPages;
    self.currentPage = 1;
    self.offset = 0;
}

- (void) leftArrow:(id)_param {
    if (self.currentPage == 1) 
        return;
    self.offset -= (NSUInteger)self.pageHeight;
    self.currentPage--;
    [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"scrollTo(0, %d)", (self.offset * 2)]];
}

- (void) rightArrow:(id)_param {
    if (self.currentPage == self.documentPages) 
        return;
    self.offset += (NSUInteger)self.pageHeight;
    self.currentPage++;
    [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"scrollTo(0, %d)", (self.offset * 2)]];
}

Некоторые наблюдения

  1. Расчет смещения не является идеальным для страницы. Если размер документа PDF не равен 8,5 x 11 (например, A4), ошибка смещения усугубляется быстрее.

  2. Свойство self.currentPage не обновляется при прокрутке веб-представления посредством перетаскивания. Можно перетащить несколько страниц, а затем прикосновение к стрелке влево или вправо на панели инструментов приведет к неожиданному перемещению смещения на предыдущую страницу.

  3. В этом решении используется UIWebDocumentView, который является частным и может вызвать отклонение приложения.

Думаю, я отправлю запрос на усовершенствование функции в Apple.

Кто-нибудь создавал не-1078 * средство просмотра PDF (с исходным кодом)?

Ответы [ 5 ]

4 голосов
/ 11 февраля 2011

Так что этот пост был открыт довольно давно, но так как это первая запись в поиске Google для "scroll pdf uiwebview", я подумал, что я предоставлю свой взгляд на это для будущих читателей.

Вы действительно можете прокрутить до определенной страницы в документе PDF, используя только чистый Java Script. Я разместил пример кода в нашем блоге (http://apptech.next -munich.com / 2011/02 / pdf-in-uiwebview.html ), но вот краткое резюме того, что вам нужно сделать:

  1. Используйте свойство DOM window.outerHeight, чтобы найти общую высоту визуализированного PDF-документа.
  2. Используйте свойство DOM window.innerHeight, чтобы найти высоту окна браузера в координатах браузера.
  3. Перейти на страницу с помощью функции window.scrollTo (x, y).

Однако есть одна загвоздка в том, что вы не можете просто скомпоновать externalHeight по количеству страниц и перейти к полученному. Вместо этого вам придется умножать на отношение innerHeight / webView.bounds.size.height.

1 голос
/ 24 сентября 2013

Я столкнулся с аналогичной проблемой, при которой мне пришлось прокрутить до определенной страницы в PDF (которая отображается с помощью UIWebView) при выборе ячейки, соответствующей этой странице в tableView (миниатюра tableview).

Итак, я написал фрагмент кода, который позволяет вам прокручивать до определенной страницы в PDF.

Я не использую какой-либо код JavaScript. Я просто отслеживаю масштаб увеличения, применяемый к исходной странице PDF каждый раз, и вычисляю обновленное смещение, необходимое для прокрутки на каждую страницу. Таким образом, это работает, даже если PDF находится в увеличенном состоянии.

Вы можете найти код здесь .

1 голос
/ 14 сентября 2012

uiwebview, обычно используемый для загрузки pdf, имеет собственный объект scrollview, к которому вы можете обращаться. попробуйте что-то вроде этого:

    [webview.scrollView setContentOffset:CGPointMake(0, webview.scrollView.contentOffset.y + 100) animated:YES];    

Это позволит прокрутить просмотр PDF на 100 пикселей вниз. Что касается получения pagenumber pdf, я могу только представить, что javascript - это то, на что вам нужно взглянуть. Или, если вы просто знаете количество пикселей на каждой странице pdf, то увеличивайте или уменьшайте по мере необходимости. :)

1 голос
/ 04 марта 2010

Я видел ваши изменения в вопросе. Кто-нибудь создавал средство просмотра PDF без UIWebView (с исходным кодом)?

Смотри мой вопрос.

Чтение PDF-файлов в виде строки через приложение iPhone

Имеет функциональность для отображения каждой страницы PDF в виде изображения. Пользователь может легко менять страницы. Но недостающие моменты заключаются в следующем.

  • пользователь не может сделать никакого выбора - это не текст, а изображение
  • пользователь не может найти текст.
  • пользователь не может увеличивать масштаб (о да - вы можете поместить просмотр изображения в режим прокрутки для увеличения)
1 голос
/ 18 декабря 2009

Я думаю, что вам придется загружать и отображать PDF самостоятельно, используя PDF API, а не UIWebView. Вот возможное представление о том, как имитировать щелчковую прокрутку до границ прямоугольной сетки, которая может помочь вам сделать пользовательский интерфейс более похожим на UIWebView.

iPhone sdk Cocoa Touch - передача касается родительского UIView на дочерний UIScrollview

...