none
[C#] WebBrowserで表示したPDFファイルの総ページ数 RRS feed

  • 質問

  • お世話になります。

    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ではなく画像等に変換して表示したほうが良いのでしょうか。
    ――――――――――――――――――――――――――――

    2018年11月15日 9:09

回答

  • 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
    2018年11月15日 13:20

すべての返信

  • 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
    2018年11月15日 13:20
  • 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に固執しすぎないよう心がけます。

    2018年11月16日 2:57
  • HongLiangさん、回答マーク後にすみません。よろしければアドバイスをください。

    今回の場合のCOMオブジェクトの解放は、C#ではどのように記述するのでしょうか。

    (ご教示いただいたサイトはVBのため、私の知識が足らずいまいち理解できません...

    アプリケーション自体は終了でき、タスクマネージャにも残らないのですが、

    エクスプローラで操作(フォルダ移動や名前変更など)しようとすると

    「別のプログラムがこのフォルダーまたはファイルを開いているので、操作を完了できません」となり、

    きちんと解放できていないようです。



    • 編集済み youme00 2018年11月20日 1:12
    2018年11月16日 4:24
  • 一般的には、Closeした後で

    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(pdfDoc);

    で良いはずですが、自プロセスが終了してもファイルロックが残るというケースはこれだけじゃダメかも。

    その場合はもうAcrobatを使うのは諦めてサードパーティー製のPDFライブラリを探したほうがかえって早いかも(作ったプログラムを頒布するのであればライセンスに気を付ける必要がありますが)。

    2018年11月16日 5:02
  • なるほど...。

    試してみましたが、やはりその1行を追加しただけでは状況は変わりませんでした。

    サードパーティ製のものも検討してみます。参考になりました、ありがとうございました!

    2018年11月16日 6:22