読者です 読者をやめる 読者になる 読者になる

[iOS][Xcode 4.2] UIWebViewで表示しているPDFを任意のページにジャンプさせる

 いろんなページを見ていくと、なんか Quartzでやったらどうだとか、そういう話ばっかりなので、ほぼあきらめてたんですが、

「んじゃあ、PDF の中のリンクをクリックしたときの動作ってどうなってんのよ?」

という観点で見てみたら結構簡単に解決しました。

 以下、適当なビューコントローラーに UIWebView をのせて、pdfDispArea という名前を付けたと思って読んでください。…不親切?


- (void) viewDidLoad:(id)sender{
    // test.pdf の URL を取得(今回はプロジェクト内の test.pdf を表示)
    NSURL* url = [[NSBundle mainBundle] URLForResource:@"test"
                                         withExtension:@"pdf"];
        
    // 作成した URL にて、NSURLRequest を作成
    NSURLRequest* req = [NSURLRequest requestWithURL:url];
    
    // pdfDispArea (UIWebView) にロードリクエストをかける
    [self.pdfDispArea loadRequest:req];    
    
    // pdfDispArea (UIWebVIew) の表示をページにフィットさせる (別にやらなくてもいい)
    [self.pdfDispArea setScalesPageToFit:YES];
}
// pdf を 10 ページにジャンプ
- (void)jumpTo10:(id)sender{

    // test.pdf の URL を取得する(今回はプロジェクト内の test.pdf を表示)
    NSURL* url = [[NSBundle mainBundle] URLForResource:@"test"
                                         withExtension:@"pdf"];
    
    // ジャンプする URL を作成 (この場合file:///hoge〜/test.pdf#page10 となる)
    NSString *jumpUrl = [NSString stringWithFormat:@"%@#page%d", url, 10];
    
    // 作成した URL 文字列から NSURL を作成
    NSURL *url2 = [[NSURL alloc] initWithString:jumpUrl];
    
    
    // 作成した NSURL にて、NSURLRequest を作成
    NSURLRequest* req = [NSURLRequest requestWithURL:url2];
    
    // pdfDispArea (UIWebView) にロードリクエストをかける
    [self.pdfDispArea loadRequest:req];    
    
    // pdfDispArea (UIWebVIew) の表示をページにフィットさせる (別にやらなくてもいい)
    [self.pdfDispArea setScalesPageToFit:YES];
    
    [url2 release];
}



 こういう風にすると、jumpTo10 メソッドを呼び出すと UIWebView で pdf 10 ページ目にジャンプできます。
jumpTo10メソッドは相当適当に書いてるので、名前の付け方も、何もかもいい加減ですが、まあこんな感じです。

 毎度の事なんですけど、コードはどうぞご自由にお使いください。

 で、間違いや、もっとこうするといいよ!というところはどうぞご指摘お願いいたします。

 

 ちなみに、pdfファイルのページ数を取得するのは

 

    // PDF ファイルの URL を取得
    NSURL* url = [[NSBundle mainBundle] URLForResource:@"test
                                         withExtension:@"pdf"];
    
    // URL から DocumentRefを作成
    CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)url);
    
    //pdfのページ数を取得
    int pageCount = CGPDFDocumentGetNumberOfPages(pdf);

ね。