9

可以使用 JavaScript 设置 a 的像素 y 偏移量UIWebView,例如:

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

那么有没有办法得到:

  1. Web 视图中 PDF 单个页面的像素高度?
  2. 页面之间的间隙大小?

这些信息是否可以从UIWebView或可以通过其他方式计算?

我在想,如果我有页面数(通过CGPDFDocumentGetNumberOfPages)、页面之间的像素高度差距或单个页面的像素高度,我可以计算出offset与 JavaScript 调用一起使用的值。然后我只需连接一个UIButtonUISlider在页面之间移动。


编辑我

我有一个解决方案,但它UIWebDocumentView使用UIWebView.

我创建了一个名为 的视图控制器PDFViewerViewController,它是 的子类WebViewerViewController,它本身是一个包含 a UIToolbar、 aUIWebView并符合UIWebViewDelegate协议的视图控制器。

在调用 Web 视图委托方法后,我PDFViewerViewController会计算有关封闭 Web 视图和 PDF 数据的一些信息-webViewDidFinishLoad:

此信息用于计算通过 JavaScript 提供给 Web 视图的近似每页偏移量。

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. 通过触摸拖动滚动浏览 Web 视图时,该self.currentPage属性不会更新。可能会拖几页,然后触摸工具栏上的左箭头或右箭头会导致偏移量意外移动到上一页。

  3. 此解决方案使用UIWebDocumentView, 这是私有的,可能会导致应用程序拒绝。

我想我会向 Apple 提出功能增强请求。

有没有人构建了一个非UIWebView基础的 PDF 查看器(带有源代码)?

4

5 回答 5

4

所以这篇文章现在已经开放了很长一段时间,但由于它是谷歌搜索“scroll pdf uiwebview”的第一个条目,我想我会为未来的读者提供我的看法。

您确实可以使用纯 Java 脚本滚动到 PDF 文档中的特定页面。我已经在我们的博客 ( http://apptech.next-munich.com/2011/02/pdf-in-uiwebview.html ) 上发布了示例代码,但这里是您需要做的简短摘要:

  1. 使用 window.outerHeight DOM 属性来查找呈现的 PDF 文档的总高度。
  2. 使用 window.innerHeight DOM 属性在浏览器坐标中查找浏览器窗口的高度。
  3. 使用 window.scrollTo(x, y) 函数跳转到页面。

但是,有一个问题,您不能仅通过页数来设置 outerHeight 并跳转到您得到的内容。相反,您必须乘以 innerHeight/webView.bounds.size.height 比率。

于 2011-02-11T09:22:41.413 回答
1

我已经看到您有问题的编辑。有没有人构建了一个非基于 UIWebView 的 PDF 查看器(带有源代码)?

看我的问题。

通过 iPhone 应用程序以字符串形式读取 PDF 文件

它具有在图像视图中显示每个 pdf 页面的功能。用户可以轻松更改页面。但缺失的地方如下。

  • 用户无法进行任何选择 - 因为它不是文本而是图像
  • 用户找不到任何文本。
  • 用户无法缩放(哦,是的 - 您可以将图像视图放在滚动视图中以实现缩放功能)
于 2010-03-04T09:46:53.723 回答
1

我认为您必须使用 PDF API 而不是 UIWebView 自己加载和显示 PDF。这是一个关于如何模拟对齐滚动到矩形网格边界的可能想法,它可以帮助您使用户体验更像 UIWebView。

iPhone sdk Cocoa Touch - 将触摸从父 UIView 传递到子 UIScrollview

于 2009-12-18T13:14:53.150 回答
1

我遇到了类似的问题,其中我必须滚动到 PDF 中的特定页面(使用 UIWebView 显示)选择与 tableView 中该页面对应的单元格(缩略图 tableview)。

所以我写了一段代码,可以让你滚动到 PDF 中的特定页面。

我没有使用任何 javascript 代码。我只是跟踪每次应用于原始 PDF 页面的缩放比例并计算滚动到每个页面所需的更新偏移量。因此,即使 PDF 处于缩放状态,这也有效。

你可以在这里找到代码。

于 2013-09-24T05:35:09.990 回答
1

通常用于加载 pdf 的 uiwebview 有它自己的滚动视图对象,您可以调用它。尝试这样的事情:

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

这会将 pdf 的视图向下滚动 100 像素。至于获取pdf的页码,我只能想象javascript是你需要看的。或者,如果您只知道 pdf 每一页上的像素数,则根据需要增加或减少。:)

于 2012-09-14T00:56:58.297 回答