Frage

Wir haben ein Formular, das das WebBrowser-Steuerelement hostet.Das ist das einzige Steuerelement auf dem Formular.

Wir passieren die form der Datei-Pfad der temporären PDF-Datei und es funktioniert:

WebBrowser1.Navigate(Me._PathToPdf)

Wenn Sie das Formular schließen, gelangen Sie Weg von der PDF-Datei:

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

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

Sobald das Formular geschlossen wird, wird der aufrufende Klasse löscht dann die temporären PDF-Datei.

Dieser Prozess funktioniert Super...bis wir den Internet Explorer 8 installiert.Für einige Grund, die Kombination von IE8 und Adobe Acrobat 8 (oder 9) bewirkt, dass eine extra-Datei-lock-Griff platziert werden auf die temporäre PDF-Datei.Die extra-lock-Griff nicht Weg gehen, bis die gesamte Anwendung heruntergefahren wird.Ich sollte auch erwähnen, dass es keine sperren auf die Datei, bis die Datei geöffnet ist, die von Acrobat.

Wir können reproduzieren diese auf mehreren Maschinen und es ist immer die Kombination von IE8 und Adobe Acrobat Reader.Können wir installieren Foxit Reader 3 anstelle von Adobe Acrobat und die Dinge funktionieren.Ebenfalls, wir führen die app auf einem Computer mit IE7 und Adobe Acrobat, und die Dinge funktionieren.Aber, wenn Sie mischen Sie den Zaubertrank der IE 8 und Acrobat, die Sie am Ende mit einem Durcheinander.

Kann mir jemand sagen, warum ich bin immer ein extra lock-Datei, die anhält, bis das Ende der Anwendung?

Vielen Dank.

Eine Beispielanwendung, die veranschaulicht, mein problem kann hier gefunden werden: PDFLockProblemDemo.zip

War es hilfreich?

Lösung

Mir scheint, die wirkliche Probleme mit einem WebBrowser control host Adobe Reader, web-browser-plugin zum anzeigen von PDF-Dateien.Gibt es nicht eine bessere Möglichkeit zur Anzeige von PDF-Dateien direkt, ohne dass eine Abhängigkeit von einem web-browser?Nicht Adobe bieten ein SDK oder ein ActiveX-Steuerelement können Sie host-direkt in Ihre form?


UPDATE:Ich schaute mich um und fand dieser Beitrag wo Sie Zugriff auf eine Adobe-ActiveX-Steuerelement (AxAcroPDFLib.AxAcroPDF) und einfach anrufen:

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

Andere Tipps

Ich habe eine Antwort, die nicht erfordern, alle temporären Dateien.

Ich war gezwungen, eine Lösung zu schaffen, nach der ich war nicht in der Stimmung umschreiben von allen meinen code zu verwenden temporäre Dateien.

So, hier ist, was Sie tun.

  1. Erstellen Sie eine Liste von Zeichenfolgen zu halten Dateien zu löschen
    Dim filesToDelete As List(Of String) = New List(Of String)

  2. Sie müssen den webbrowser, um eine weitere pdf-Datei,
    (Ich erstellt eine leere - schwarz oder weiß;was auch immer für Sie funktioniert).
    So wie webbrowser1.navigate("blank.pdf" )

  3. Fügen Sie die Datei, die gelöscht werden, um eine Liste von strings.so filesToDelete.Add(filename)

  4. Nun, hier ist der trick.Die Ressourcen werden nicht freigegeben werden, bis Sie aus dieser Veranstaltung.
    So müssen Sie sich auf etwas anderes konzentrieren, das zu einem anderen Ereignis ausgelöst werden.
    In meinem Fall wurde ich mit einem treeview anzeigen der pdf-Datei.
    So, nach dem markieren der Datei für die Löschung mit der oben beschriebenen Methode,
    ich würde die Strukturansicht in eine andere Datei.
    So in den TreeView1_BeforeSelect Methode, ich habe die Hand:

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


    Sie können nehmen Ihre eigene Veranstaltung, aber ich bin sicher, nachdem Sie die Markierung für das löschen, können Sie etwas finden, das zu tun, Ursache ein anderes Ereignis ausgelöst.Folgen Sie einfach den Fluss von Ihrem code, was als Nächstes passiert.



So dort haben Sie es.Hoffe, dass dies jemandem geholfen.

Immer noch keine Lösung gefunden, aber mehr info:Vorher hatte ich getestet, mit XP Pro, Acrobat *.x und .NET 2.0 (gebaut mit VS 2005).Seitdem habe ich auch getestet, die in einer Vielzahl von Szenarien, die zählen Vista, Acrobat 9.x und .NET 3.5 (gebaut mit VS 2008).

Gleiche Ergebnisse, wenn:solange der browser IE8, die PDF-Datei nicht freigegeben, wenn Sie rufen Sie Dispose() für den WebBrowser-Steuerelement.Es nicht bekommen freigegeben, wenn die app geschlossen ist, aber das hilft uns nicht...

Hoffe, das hilft.

Wir hatten das gleiche problem mit IE8 und Acrobat.In unserem Fall haben wir einfach in der Lage sein, das überschreiben der temporären PDF-Datei und es wieder einzublenden.Wir haben festgestellt, dass wir könnten Sie einfach öffnen Sie die PDF, schreiben von 0 bytes, die dann auf schließen.Danach würden wir öffnen Sie die Datei und schreiben Sie den neuen PDF-Informationen und dann wieder die temporäre Datei.

In Zusammenfassung, lösen wir nicht das file locking-problem, sondern wir nur Links, die Datei-handle befestigt und wiederverwendet, die Datei, bis der Benutzer schließt die app.

Hoffe, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top