Есть ли способ программно прокрутить страницу PDF в UIWebView?

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

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

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

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

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

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


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

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

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

мой 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.

Кто-нибудь построил UIWebView Просмотрщик PDF (с исходным кодом)?

5 ответов

Так что этот пост был открыт довольно давно, но так как это первая запись в поиске 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

iPhone SDK Cocoa Touch - передача прикосновения от родительского UIView к дочернему UIScrollview

Другие вопросы по тегам