【问题标题】:How to control page display to PDF loaded in UIWebView for iOS (go to page)如何控制页面显示为在 iOS 的 UIWebView 中加载的 PDF(转到页面)
【发布时间】:2013-10-14 10:04:59
【问题描述】:

我正在开发一个显示嵌入在 WebView 中的 PDF 的应用程序,这是我的代码:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSURL *urlremoto = [NSURL URLWithString:@"https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/TransitionGuide.pdf"];

    request = [NSURLRequest requestWithURL:urlremoto];

    [self.webView loadRequest:request];
    [self.webView setScalesPageToFit:YES];
}

-(void)webViewDidStartLoad:(UIWebView *)webView{

    [self.activityIndicator startAnimating];
}

-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
    //TODO: describir el error
    [self.activityIndicator stopAnimating];        
}

-(void)webViewDidFinishLoad:(UIWebView *)webView{

    [self.activityIndicator stopAnimating];
}

现在我想触摸一个按钮并将我加载的 PDF 更改为某个页面,我正在寻找一些东西来实现这一点,但仍然没有任何工作

提前感谢您的支持

【问题讨论】:

标签: ios pdf uiwebview


【解决方案1】:

虽然晚了,但可能会有所帮助,

对于低于 11.0 的 iOS

func webViewDidFinishLoad(_ webView: UIWebView)
    {

        var pdfPageHeight:CGFloat = 0

        let a = webView.scrollView.subviews

        for var view in a
        {
            if view.isKind(of: NSClassFromString("UIWebPDFView")!)
            {
                let b = view.subviews

                for var iview in b
                {
                    if iview.isKind(of: NSClassFromString("UIPDFPageView")!)
                    {
                        pdfPageHeight = iview.bounds.size.height

                        break
                    }
                }
            }
        }

        webView.scrollView.setContentOffset(CGPoint(x: 0, y: CGFloat((pagenumber - 1)   + 1 )*pdfPageHeight), animated: true)

    }

适用于 iOS 11 及更高版本

var pdfdocumentURL: URL?

    @IBOutlet weak var titleLbl: UILabel!
    @IBOutlet weak var pdfview: PDFView!
    var pagenumber = 1



    override func viewDidLoad()
    {
        super.viewDidLoad()
        self.titleLbl.text = titleStr

       let pdfdocument = PDFDocument(url: pdfdocumentURL!)

        pdfview.document = pdfdocument
        pdfview.displayMode = PDFDisplayMode.singlePageContinuous
        pdfview.autoScales = true

        pagenumber = pagenumber - 1
        if let page = pdfdocument?.page(at: pagenumber) {
            pdfview.go(to: page)
        }


    }

【讨论】:

  • 甚至还有pdfView.goToNextPage(nil)pdfView.goToPreviousPage(nil)
【解决方案2】:

此时我认为您可以使用两种方法:

  1. 使用 scrollView 浏览 PDF:

    [[webView scrollView] setContentOffset:CGPointMake(0,y) 动画:YES];

    //例如跳转到页高1000px的PDF文档的第5页:

    int selectedPag = 5; // i.e. Go to page 5
    
    float pageHeight = 1000.0; // i.e. Height of PDF page = 1000 px;
    
    float y = pageHeight * selectedPag;
    
    [[webView scrollView] setContentOffset:CGPointMake(0,y) animated:YES];
    
  2. 拆分 PDF 单个页面。

【讨论】:

  • 我在 UIWebViewDelegate 方法中尝试了你的行:-(void)webViewDidFinishLoad:(UIWebView *)webView;这但没有像这样工作:[[self.webView scrollView] setContentOffset:CGPointMake(0,-800) animated:YES];
  • 成功了!!!感谢您分享您的专业知识 =D 最后一个问题,有没有一种方法可以动态地获取 pageHeight,这对于构建一种方法可能非常有用,无论如何我都会搜索它,但如果您知道那会很棒
  • 我发现此链接可能对您有用:stackoverflow.com/questions/3045587/…
  • 很棒的代码 sn-p!但是如何获取 PDF 文档的页面高度呢?
  • 它对我不起作用。我加载了请求然后滚动,然后添加到superview。 [webView loadRequest:request]; [[webView scrollView] setContentOffset:CGPointMake(0,200) 动画:YES]; [self.view addSubview:webView];
【解决方案3】:

据我所知,Safari Kit 不支持命名目的地 (RFC 3778)。换句话说,如果你试试这个:

<a href="http://www.domain.com/file.pdf#page=3">Link text</a>

在 Safari 中,它不起作用。

据我所知,您跳转到 PDF 页面的唯一机会是使用 Reader 之类的框架或其他等效框架。

【讨论】:

    【解决方案4】:

    正如RFG所说,使用webview的scrollview是完美的,关键步骤是找出pdf页面的高度,下面的代码会得到pdf文件的整个高度和pdf文件的页面数。然后我们得到它!

    第一种方式:

    //get the total height
    CGFloat pageHeight = self.webView.scrollView.contentSize.height;
    //get page nums
    -(NSInteger)getTotalPDFPages:(NSString *)strPDFFilePath
    {
        NSURL *pdfUrl = [NSURL fileURLWithPath:strPDFFilePath];
        CGPDFDocumentRef document = CGPDFDocumentCreateWithURL((CFURLRef)pdfUrl);
        size_t pageCount = CGPDFDocumentGetNumberOfPages(document);
        return pageCount;
    }
    

    第二种方式:

    //get the content info 
    - (void)webViewDidFinishLoad:(UIWebView *)webView
    {
        [self.okBtn setEnabled:YES];
        [self.signPdfBtn setEnabled:YES];
        NSArray* a = [self.webView.scrollView subviews];
        for (UIView* view in a) {
            if ([view isKindOfClass:NSClassFromString(@"UIWebPDFView")]) {
                NSArray* b = view.subviews;
                self.content_hetght = view.bounds.size.height;
                self.content_num = b.count;
                }
        }
    }
    //then you can jump any page,like the last page
    [self.webView.scrollView setContentOffset:CGPointMake(0, (self.content_num-1)*(self.content_hetght*1.0 /self.content_num)) animated:YES];
    

    【讨论】:

      【解决方案5】:

      Swift 3 版本:

          let selectedPag: CGFloat = 5; // i.e. Go to page 5
      
          let pageHeight: CGFloat = 1000.0; // i.e. Height of PDF page = 1000 px;
      
          let y: CGFloat = pageHeight * selectedPag;
      
          let pageOffset = CGPoint(x: 0, y: y)
          WebViewMore.scrollView.setContentOffset(pageOffset, animated: true)
      

      【讨论】:

      • 问题的棘手部分是找出 pageHeight 的正确值,而不是如何滚动部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 2013-01-22
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      相关资源
      最近更新 更多