WinForms で IE 8 をホストし、PDF を開く
-
03-07-2019 - |
質問
WebBrowser コントロールをホストするフォームがあります。これがフォーム上の唯一のコントロールです。
フォームに一時 PDF ファイルのファイル パスを渡すと、次のようになります。
WebBrowser1.Navigate(Me._PathToPdf)
フォームが閉じると、PDF ファイルから移動します。
WebBrowser1.Hide()
WebBrowser1.Navigate("about:blank")
Do Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete
Application.DoEvents()
System.Threading.Thread.Sleep(50)
Loop
フォームが閉じられると、呼び出しクラスは一時 PDF ファイルを削除します。
このプロセスはうまく機能します...Internet Explorer 8 をインストールするまでは。何らかの理由で、IE8 と Adobe Acrobat 8 (または 9) を組み合わせると、一時 PDF ファイルに追加のファイル ロック ハンドルが配置されます。余分なロック ハンドルは、アプリケーション全体がシャットダウンされるまで消えません。ファイルが Acrobat によって開かれるまで、ファイルはロックされないことにも注意してください。
これは複数のマシンで再現でき、常に IE8 と Adobe Acrobat Reader の組み合わせになります。Adobe Acrobat の代わりに Foxit Reader 3 をインストールすると、問題なく動作します。同様に、IE7 と Adobe Acrobat を搭載したマシンでアプリを実行することもでき、問題なく動作します。しかし、IE 8 と Acrobat の魔法の薬を混ぜると、最終的には混乱してしまいます。
アプリケーションが終了するまで追加のファイル ロックが発生する理由を誰か教えていただけますか?
ありがとう。
私の問題を示すサンプルアプリケーションはここにあります。 PDFLock問題デモ.zip
解決
私にとって本当の問題は、 WebBrowser
PDF を表示するための Adobe Reader Web ブラウザ プラグインをホストするコントロール。Web ブラウザーに依存せずに PDF を直接表示する、もっと良い方法はないでしょうか?Adobe は、フォーム内で直接ホストできる SDK または ActiveX コントロールを提供していませんか?
アップデート:周りを見回して見つけました この郵便受け ここで Adobe ActiveX コントロールにアクセスします (AxAcroPDFLib.AxAcroPDF
) そして単に呼び出します:
axAcroPDF1.LoadFile("mypdf.pdf");
axAcroPDF1.Show();
他のヒント
一時ファイルを必要としない答えがあります。
一時ファイルを使用するようにすべてのコードを書き直す気分ではなかったので、解決策を作成する必要がありました。
それで、これがあなたがすることです。
削除するファイルを保持する文字列のリストを作成する
Dim filesToDelete As List(Of String) = New List(Of String)
ウェブブラウザを別の PDF ファイルに設定する必要があります。
(私は白または黒の空白のものを作成しました。あなたにとってうまくいくものなら何でも)。
以下のようなのでwebbrowser1.navigate("blank.pdf" )
削除するファイルを文字列のリストに追加します。それで
filesToDelete.Add(filename)
さて、ここにトリックがあります。このイベントを終了するまでリソースは解放されません。
したがって、別のイベントを発生させるために、何か別のことにフォーカスする必要があります。
私の場合、PDF を表示するためにツリービューを使用していました。
したがって、上記の方法を使用してファイルに削除のマークを付けた後、
ツリービューを別のファイルに設定します。
それで、TreeView1_BeforeSelect
方法として、私は明白なことを行いました:
If filesToDelete.Count > 0 Then
For Each f As String In filesToDelete
File.Delete(f)
Next
filesToDelete.Clear()
End If
独自のイベントを採用することもできますが、削除のマーキングを行った後は、別のイベントを発生させる何かを見つけることができると思います。次に何が起こるかは、コードの流れに従ってください。
これで完了です。これが誰かの役に立てば幸いです。
まだ解決策は見つかりませんが、詳細情報は次のとおりです。以前は、XP Pro、Acrobat *.x、および .NET 2.0 (VS 2005 で構築) をテストしていました。それ以来、Vista、Acrobat 9.x、.NET 3.5 (VS 2008 で構築) を含むさまざまなシナリオでもテストしてきました。
同じ結果ですが:ブラウザが IE8 である限り、WebBrowser コントロールで Dispose() を呼び出しても PDF ファイルは解放されません。アプリを閉じると解放されますが、それは役に立ちません...
お役に立てれば。
IE8 と Acrobat でも同じ問題が発生しました。私たちの場合、一時的な PDF を上書きして再表示できるようにするだけで済みました。PDF を開いて 0 バイトを書き込んで閉じるだけでよいことがわかりました。その後、ファイルを開いて新しい PDF 情報を書き込み、一時ファイルを再表示します。
要約すると、ファイル ロックの問題は解決せず、ファイル ハンドルをアタッチしたままにし、ユーザーがアプリを閉じるまでファイルを再利用しました。
お役に立てれば。