2009-04-30 7 views
6

WebBrowserコントロールをホストするフォームがあります。それがフォーム上の唯一のコントロールです。WinFormsでIE 8をホストしてPDFを開く

我々は、フォームに一時的なPDFファイルのファイルパスを渡し、それはありません:一度

WebBrowser1.Hide() 
WebBrowser1.Navigate("about:blank") 

Do Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete 
    Application.DoEvents() 
    System.Threading.Thread.Sleep(50) 
Loop 

WebBrowser1.Navigate(Me._PathToPdf) 

フォームが閉じている、それはPDFファイルから移動しますフォームが閉じられると、呼び出し側のクラスは一時的な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を混ぜると、混乱することになります。

私はなぜアプリケーションの最後までファイルのロックが継続しているのか教えていただけますか?

ありがとうございました。

私の問題を示す例アプリケーションは、ここで見つけることができます:

+0

申し訳ありませんが、私たちはこの問題の解決策を見つけることができませんでしたので、フォーム上でActiveX Acrobat Readerコントロールを使用しました。残念なことに残念なことに、私たちはAcrobat Readerのバージョンに縛られていましたが、バージョンを入手する必要がありました。 私は質問を終了します。 –

答えて

1

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


UPDATE:私は周りを見回し、彼らはアドビシステムズ社のActiveXコントロール(AxAcroPDFLib.AxAcroPDF)にアクセスし、簡単に呼び出すthis postが見つかりました:

axAcroPDF1.LoadFile("mypdf.pdf"); 
axAcroPDF1.Show(); 
+1

はい、実際にAdobe Acrobatが提供するCOMオブジェクトを使用しています。しかし、これは理想的ではありません。なぜなら、現在はAdobe Acrobatに直接結びついており、そのプログラムをアプリケーションの前提条件にする必要があるからです。以前は、PDF表示アプリケーション(AcrobatまたはFoxitのほとんどの時間)が必要でした。 –

1

PDFLockProblemDemo.zipはまだ何も解決策が見つからなかったが、より多くの情報: 以前私はXPのProは、Acrobatが.Xと.NET 2.0(で構築された*でテストされていましたVS 2005)。それ以来、私はVista、Acrobat 9.x、.NET 3.5(VS 2008で構築された)を含むさまざまなシナリオでもテストしました。

同じ結果が表示されます。ブラウザがIE8の場合、WebBrowserコントロールでDispose()を呼び出すと、PDFファイルが解放されません。アプリが閉鎖されたときにリリースされますが、それは私たちを助けません...

希望に役立ちます。

+0

はい、私たちが何をやっているのかを正確に表しています。 ありがとうございます。 –

0

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

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

これが役に立ちます。

1

私はすべての一時ファイルを必要としない答えを持っています。

テンポラリファイルを使用するためにすべてのコードを書き直す気にならなかったので、私は解決策を作成しなければなりませんでした。

だからこそ、あなたは何をしているのですか?

  1. (私は空白の1を作成した
    、あなたは別のPDFファイルにウェブブラウザを設定する必要が
    Dim filesToDelete As List(Of String) = New List(Of String)

  2. を削除するファイルを保持する文字列のリストを作成する - 黒または白;のために働くものは何でも君は)。
    so like webbrowser1.navigate("blank.pdf")

  3. 削除するファイルを文字列のリストに追加します。 so 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


    自分のイベントを採用することもできますが、削除のマーキングを実行した後、別のイベントが発生する原因となることがわかります。あなたのコードの流れに従ってください。次に何が起こりますか?



です。これが誰かを助けたと思っています。

+0

イベントを発生させる代わりに、 '' 'Application.DoEvents()' ''を呼び出してから削除することができます。 –

関連する問題