6

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ファイルを削除します。

このプロセスはうまく機能します...InternetExplorer 8をインストールするまでは、何らかの理由で、IE8とAdobe Acrobat 8​​(または9)の組み合わせにより、一時PDFファイルに追加のファイルロックハンドルが配置されます。余分なロックハンドルは、アプリケーション全体がシャットダウンされるまで消えません。また、Acrobatでファイルを開くまで、ファイルにロックはありません。

これは複数のマシンで再現でき、常にIE8とAdobeAcrobatReaderの組み合わせです。AdobeAcrobatの代わりにFoxitReader3をインストールでき、問題なく動作します。同様に、IE7とAdobe Acrobatを搭載したマシンでアプリを実行でき、問題なく動作します。しかし、IE 8とAcrobatの魔法のポーションを混ぜると、混乱してしまいます。

アプリケーションが終了するまで持続する余分なファイルロックが発生する理由を誰かに教えてもらえますか?

ありがとう。

私の問題を示すサンプルアプリケーションはここにあります:PDFLockProblemDemo.zip

4

4 に答える 4

1

まだ解決策は見つかりませんが、詳細情報: 以前、XP Pro、Acrobat *.x、および .NET 2.0 (VS 2005 でビルド) でテストしました。それ以来、Vista、Acrobat 9.x、および .NET 3.5 (VS 2008 でビルド) を含むさまざまなシナリオでテストも行ってきました。

ただし、結果は同じです。ブラウザーが IE8 である限り、WebBrowser コントロールで Dispose() を呼び出しても PDF ファイルは解放されません。アプリを閉じると解放されますが、それは役に立ちません...

お役に立てれば。

于 2009-05-12T15:17:50.907 に答える
1

一時ファイルを必要としない答えがあります。

一時ファイルを使用するようにすべてのコードを書き直す気分ではなかったので、解決策を作成することを余儀なくされました。

それで、これがあなたがすることです。

  1. 削除するファイルを保持する文字列のリストを作成します
    Dim filesToDelete As List(Of String) = New List(Of String)

  2. Webブラウザを別のpdfファイルに設定する必要があります
    (私は空白のファイルを作成しました-黒または白;あなたのために働くものは何でも)。
    以下のようなのでwebbrowser1.navigate("blank.pdf" )

  3. 削除するファイルを文字列のリストに追加します。それでfilesToDelete.Add(filename)

  4. さて、ここにトリックがあります。このイベントを終了するまで、リソースは解放されません。
    したがって、別のイベントが発生する原因となる何かに焦点を当てる必要があります。
    私の場合、ツリービューを使用してpdfを表示していました。
    したがって、上記の方法を使用してファイルを削除するようにマークした後
    、ツリービューを別のファイルに設定します。
    したがって、このTreeView1_BeforeSelectメソッドでは、明らかなことを行いました

    If filesToDelete.Count > 0 Then
        For Each f As String In filesToDelete
           File.Delete(f)
        Next
        filesToDelete.Clear()
    End If


    。独自のイベントを採用できますが、削除のマーキングを行った後、別のイベントを発生させる何かを見つけることができると確信しています。次に何が起こるか、コードの流れに従ってください。



それで、あなたはそれを持っています。これが誰かを助けたことを願っています。

于 2011-11-25T15:48:59.590 に答える
1

本当の問題は、WebBrowserコントロールを使用してAdobe Reader WebブラウザプラグインをホストしてPDFを表示することです。Web ブラウザーに依存せずに PDF を直接表示するためのより良い方法はありませんか? Adobe は、フォーム内で直接ホストできる SDK または ActiveX コントロールを提供していませんか?


更新: 周りを見回して、Adobe ActiveX コントロール ( ) にアクセスし、次のように呼び出すこの投稿を見つけました。AxAcroPDFLib.AxAcroPDF

axAcroPDF1.LoadFile("mypdf.pdf");
axAcroPDF1.Show();
于 2009-05-26T15:00:45.520 に答える
0

IE8 と Acrobat で同じ問題が発生しました。私たちの場合、一時的な PDF を上書きして再表示できるようにする必要がありました。PDF を開き、0 バイトを書き込んで閉じるだけでよいことがわかりました。その後、ファイルを開き、新しい PDF 情報を書き込み、一時ファイルを再表示します。

要約すると、ファイル ロックの問題は解決されませんでした。代わりに、ファイル ハンドルをアタッチしたままにし、ユーザーがアプリを閉じるまでファイルを再利用しました。

お役に立てれば。

于 2009-05-21T12:27:09.307 に答える