26502
お世話になります。

Process.Startで立ち上げたAdobeReaderから、現在開いているページ番号を  
取得する方法を教えてください。

他サイト様の掲示板から、ページ数を指定して開く方法は見つけました。  
今はその方法でPDFを開いているため、開くまではできますが、開いた後は  
親元のAdobeReaderに一任する形になっています、  
そこで、C#のフォーム側でボタンなどを押したタイミングにより、今のPDFが  
何ページ目を表示しているのか、そのページ番号を取得する方法です。  
[![画像の説明をここに入力](https://i.stack.imgur.com/zlVY4.jpg)](https://i.stack.imgur.com/zlVY4.jpg)  
Processで開く方法ではなく、C#でPDFファイルを解析して開ければ、  
ページ数であろうと何であろうと取得できるとは思いますが、私にそれだけの  
力もなく、またそれだけウェイトをかけるソフトを作るわけでもないので、  
ページ番号だけ取得できればと思っています。

バージョンはAdobe Reader XIです。

よろしくお願いいたします。
CC BY-SA 3.0
2016-06-06T01:22:27.987
26485
2016-06-06T08:36:56.110
9374
question
c# pdf
C#　Process.Startで開いたAdobeReaderから、ページ番号を取得したい
`Process.Start`で開始した別プロセスのコントロールから内容を読み取るのは比較的困難な作業です。不可能ではないと思いますが、ページ番号だけがほしいということですので、以下の簡単な手法を提案させていただきます。

まずpdfは[AxAcroPDF](http://help.adobe.com/livedocs/acrobat_sdk/9.1/Acrobat9_1_HTMLHelp/wwhelp/wwhimpl/js/html/wwhelp.htm?href=IAC_API_OLE_Objects.103.167.html&accessible=true)というコントロールを用いてWindows
Formsに埋め込み表示してしまいます。[参考](http://www.knowledge-base.jp/2010/01/10/pdf-4/)

```

    // コントロールの生成
    this.axAcroPDF1 = new AxAcroPDFLib.AxAcroPDF();
    // 配置など
    ...
    
    // pdfファイルのパスを指定して読み込み表示
    axAcroPDF1.LoadFile(t.FileName);
    
```

ここからはすこし力技ですが、子孫コントロールを検索してページ番号を表示しているコントロールを探し、そこから番号を取得します。

```

    foreach (var item in GetChildWindows(axAcroPDF1.Handle))
    {
        // ページ番号を表示するコントロールはclass="Edit"
        if (GetClassNameOfWindow(item) == "Edit")
        {
            // コントロールからページ番号を取得
            var currentPageNumber = GetTextBoxText(item);
        }
    }
    
```

AxAcroPDFにはページ変更イベントが無いようなので、とりあえずこの処理は定期的に呼び出して反映するという方法にしています。くわしくは[サンプル](https://drive.google.com/file/d/0B7hoeZkXwiiSeVVickpLbDMwZ1k/view?pref=2&pli=1)をご覧ください。

またページ数の指定についても、AxAcroPDFには[`SetCurrentPage`](http://help.adobe.com/livedocs/acrobat_sdk/9.1/Acrobat9_1_HTMLHelp/wwhelp/wwhimpl/js/html/wwhelp.htm?href=IAC_API_OLE_Objects.103.167.html&accessible=true)メソッドがあってページをプログラムから指定できます。どうせなら`GetCurrentPage`かなんかをつけてほしいですね。

以上ご検討ください。
CC BY-SA 3.0
2016-06-06T08:36:56.110
26502
2016-06-06T08:36:56.110
26485
answer