2009-04-30 11 views
6

Mamy formularz, który obsługuje kontrolkę WebBrowser. To jest jedyna kontrola w formularzu.Hosting IE 8 W WinForm i otwieranie pliku PDF

Mijamy formie ścieżkę do pliku tymczasowego pliku PDF i robi:

WebBrowser1.Navigate(Me._PathToPdf) 

Gdy forma jest zamknięcie, to opuści pliku PDF:

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

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

Po Formularz jest zamknięty, klasa wywołująca kasuje tymczasowy plik PDF.

Ten proces działa świetnie ... dopóki nie zainstalowaliśmy przeglądarki Internet Explorer 8. Z jakiegoś powodu połączenie IE8 i Adobe Acrobat 8 ​​(lub 9) powoduje umieszczenie dodatkowego uchwytu blokady pliku w tymczasowym pliku PDF. Dodatkowy uchwyt blokady nie znika, dopóki cała aplikacja nie zostanie zamknięta. Powinienem również wspomnieć, że nie ma żadnych blokad pliku, dopóki plik nie zostanie otwarty przez Acrobat.

Możemy powielać to na wielu komputerach i zawsze jest to połączenie IE8 i Adobe Acrobat Reader. Możemy zainstalować Foxit Reader 3 zamiast Adobe Acrobata i wszystko działa dobrze. Podobnie, możemy uruchomić aplikację na komputerze z IE7 i Adobe Acrobatem, i wszystko działa dobrze. Ale kiedy miksujesz magiczną miksturę IE 8 i Acrobata, kończy się bałagan.

Czy ktoś może mi powiedzieć, dlaczego otrzymuję dodatkową blokadę pliku, która trwa do końca aplikacji?

Dzięki.

Aplikacja przykład, który pokazuje mój problem można znaleźć tutaj: PDFLockProblemDemo.zip

+0

W porządku, nie mogliśmy znaleźć żadnych dobrych rozwiązań tego problemu, więc uciekliśmy się do używania formantu ActiveX Acrobat Reader w formularzu. To niestety przywiązało nas do wersji Acrobat Reader, ale konieczne było wydanie wersji na zewnątrz. Zamykam pytanie. –

Odpowiedz

1

Wydaje mi się, że prawdziwym problemem jest użycie kontrolki WebBrowser do obsługi wtyczki przeglądarki Adobe Reader do wyświetlania plików PDF. Czy nie ma lepszego sposobu wyświetlania plików PDF bezpośrednio, bez konieczności wprowadzania zależności od przeglądarki internetowej? Czy firma Adobe nie zapewnia pakietu SDK lub formantu ActiveX, który można hostować bezpośrednio w formularzu?


UPDATE: Rozejrzałem się i znalazłem this post gdzie mają dostęp kontrolki ActiveX Adobe (AxAcroPDFLib.AxAcroPDF) i po prostu zadzwoń:

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

Tak, faktycznie skorzystaliśmy z obiektu COM dostarczonego przez Adobe Acrobat. Jednak jest to mniej niż idealne, ponieważ teraz są bezpośrednio związane z Adobe Acrobat i musi umieścić ten program jako warunek wstępny do naszej aplikacji.Wcześniej wymagaliśmy tylko aplikacji do przeglądania plików PDF (najczęściej Acrobat lub Foxit). –

1

jeszcze znaleźć żadnego rozwiązania, ale więcej info: Wcześniej miałem przetestowane z XP Pro, Acrobat * .x i .NET 2.0 (zbudowany z VS 2005). Od tego czasu testowałem również w różnych scenariuszach, w tym Vista, Acrobat 9.x i .NET 3.5 (zbudowany z VS 2008).

Jednak wyniki są takie same: tak długo, jak przeglądarką jest IE8, plik PDF nie zostanie zwolniony po wywołaniu Dispose() w formancie WebBrowser. Zostaje zwolniony, gdy aplikacja jest zamknięta, ale to nam nie pomoże ...

Mam nadzieję, że to pomoże.

+0

Tak, to dokładnie opisuje, na co się natknęliśmy. Dziękujemy za aktualizację. –

0

Mieliśmy ten sam problem z IE8 i Acrobatem. W naszym przypadku musieliśmy po prostu nadpisać tymczasowy plik PDF i wyświetlić go ponownie. Odkryliśmy, że możemy po prostu otworzyć plik PDF, napisać 0 bajtów, a następnie zamknąć. Następnie otworzymy plik i napiszemy nowe informacje o pliku PDF, a następnie ponownie wyświetlimy plik tymczasowy.

Podsumowując, nie rozwiązaliśmy problemu z blokowaniem plików, zamiast tego po prostu zostawiliśmy uchwyt pliku i używaliśmy go ponownie, dopóki użytkownik nie zamknął aplikacji.

Mam nadzieję, że to pomoże.

1

mam odpowiedź, że nie będzie wymagało żadnych plików tymczasowych.

Zostałem zmuszony do stworzenia rozwiązania, po tym jak nie byłem w nastroju przepisywania całego mojego kodu, aby używać plików tymczasowych.

Oto, co robisz.

  1. Stwórz listę ciągów do przechowywania plików, aby usunąć
    Dim filesToDelete As List(Of String) = New List(Of String)

  2. Musisz ustawić przeglądarki internetowej do innego pliku PDF,
    (I utworzona pusta jeden - czarny lub biały, co działa dla ty).
    Tak jak webbrowser1.navigate("blank.pdf")

  3. Dodaj plik do usunięcia do listy ciągów. więc filesToDelete.Add(filename)

  4. Oto sztuczka. Zasoby nie zostaną udostępnione, dopóki nie wydostaniesz się z tego wydarzenia.
    Musisz więc skupić się na czymś innym, co spowoduje zwolnienie innego zdarzenia.
    W moim przypadku użyłem widoku drzewa do wyświetlenia pliku pdf.
    Tak więc, po zaznaczeniu pliku do usunięcia przy użyciu powyższej metody,
    ustawiłbym widok drzewa na inny plik.
    więc w metodzie TreeView1_BeforeSelect zrobiłem oczywiste:

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


    Możesz zaadaptować własne wydarzenie, ale jestem pewien, że po wykonaniu oznaczenia usunięcia możesz znaleźć coś, co spowoduje wybuch kolejnego zdarzenia. Po prostu obserwuj przepływ swojego kodu, co będzie dalej.


Więc już go masz. Mam nadzieję, że to pomogło komuś.

+0

Zamiast wypalania zdarzenia możesz po prostu wywołać '' Application.DoEvents() '' ', a następnie wykonać usuwanie. –