トップ回答者
[C#] WebBrowserで表示したPDFファイルの総ページ数

質問
-
お世話になります。
WPF(C#)にて、WebBrowserでローカルにあるPDFファイルを表示しています。
このPDFの総ページ数を取得することは可能でしょうか?
試しにこちらのページの回答欄にある
1行のコード("/Type /Page"でSplitするもの)を試してみましたが、返り値が-1となりうまくいきません。お力添えのほど、よろしくお願い致します。
――――――――――――――――――――――――――――
<実行環境>
・Microsoft VisualStudio Community 2017
・Microsoft .NET Framework4.5
・Adobe Acrobat Pro DC(Continuous)
また、こちらは相談程度なのですが。
今後、コンテキストメニューの使用やマウスホイール&矢印キーによるページ移動を禁止し、
閲覧のみ(ページ移動はxaml上のボタンなどでのみ操作可能)にしたいと考えているのですが、
なにか良いアプローチは無いでしょうか。
今のところWebBrowserに追従するPopupウィンドウで半透明の矩形を重ねてブロックしていますが、
これだとダイアログが出た際にPopupの下に潜ってしまい、そのダイアログを操作できなくなってしまい困っています。
また、Alt+Tabでアクティブウィンドウを切り替えた場合に、マウスホイール&矢印キーによるページ移動ができてしまうため、プログラム内の変数と表示されているページの同期が取れなくなります。。。
もはやWebBrowserではなく画像等に変換して表示したほうが良いのでしょうか。
――――――――――――――――――――――――――――
回答
-
Acrobatを持っていないので試せませんが、実行環境にAcrobatのインストールを前提にできるなら、AcrobatのCOMオブジェクトを操作して情報を取得できませんかね。
COM参照の追加でAdobe Acrobat Type Libraryみたいな名前のを参照追加して、AcroExch.PDDocをnewしてOpenしてGetNumPagesしてClose、かな?
http://pdf-file.nnn2.com/?p=111
WebBrowserを使って表示するのであれば、細かい制御は諦めた方がいいような気はします。逆に、細かい制御が必要ならWebBrowserを使うのは諦めた方がいいのではないでしょうか。
- 回答としてマーク youme00 2018年11月16日 2:59
すべての返信
-
Acrobatを持っていないので試せませんが、実行環境にAcrobatのインストールを前提にできるなら、AcrobatのCOMオブジェクトを操作して情報を取得できませんかね。
COM参照の追加でAdobe Acrobat Type Libraryみたいな名前のを参照追加して、AcroExch.PDDocをnewしてOpenしてGetNumPagesしてClose、かな?
http://pdf-file.nnn2.com/?p=111
WebBrowserを使って表示するのであれば、細かい制御は諦めた方がいいような気はします。逆に、細かい制御が必要ならWebBrowserを使うのは諦めた方がいいのではないでしょうか。
- 回答としてマーク youme00 2018年11月16日 2:59
-
Hongliangさん、回答ありがとうございます。
とても簡易的ではありますが、Adobe Acrobat 10.0 Type Libraryを参照追加後、以下のコードで無事に総ページ数の取得が出来ました^^
Type AcroPdDocType = Type.GetTypeFromProgID("AcroExch.PDDoc"); Acrobat.CAcroPDDoc pdfDoc = (Acrobat.CAcroPDDoc)Activator.CreateInstance(AcroPdDocType); pdfDoc.Open("PDFファイルパス"); Console.WriteLine("- " + pdfDoc.GetNumPages() + " -"); pdfDoc.Close();
Adobe Acrobat Type Libraryという名前は知っていたのですが、以前に軽く調べた際にVBAやWinFormsの記事が多く、勝手に遠ざけて考えていました。
わかりやすい手順を示してくださりありがとうございました。
また、相談についても助かります。
やはり細かい制御は制限されてしまいますよね。。。
今は勉強も兼ねて試行錯誤していますが、形にしていく際にはあまりWebBrowserに固執しすぎないよう心がけます。 -
HongLiangさん、回答マーク後にすみません。よろしければアドバイスをください。
今回の場合のCOMオブジェクトの解放は、C#ではどのように記述するのでしょうか。
(ご教示いただいたサイトはVBのため、私の知識が足らずいまいち理解できません...)
アプリケーション自体は終了でき、タスクマネージャにも残らないのですが、
エクスプローラで操作(フォルダ移動や名前変更など)しようとすると
「別のプログラムがこのフォルダーまたはファイルを開いているので、操作を完了できません」となり、
きちんと解放できていないようです。
- 編集済み youme00 2018年11月20日 1:12