Wyświetlanie pliku PDF w formularzu użytkownika w formacie vba (SW 2016)

Witam

Aby wyświetlić plik PDF w formularzu użytkownika, znalazłem w Internecie dwa główne rozwiązania: dodanie kontrolera "Adobe PDF Reader" lub dodanie kontrolera  "WebBrowser" .

Wybrałem rozwiązanie polegające na dodaniu kontrolera "Adobe PDF Reader" , ale nie mogę go zmusić do działania. Oto procedura, którą zastosowałem:

  1. Instalowanie programu Acrobat Reader DC
  2. W edytorze VBA, na "Przybornik"  => kliknij prawym przyciskiem myszy tło tego przybornika  => "Dodatkowe kontrolki... "  => zaznacz "Adobe PDF Reader"

    => Gdy chcę umieścić kontroler "Adobe PDF Reader" w formularzu użytkownika, pojawia się komunikat o błędzie: "Nie znaleziono elementu".

 

=> Jeśli ktoś ma odpowiednią procedurę i kod do korzystania z tego kontrolera "Adobe PDF Reader", bardzo by mi to pomogło.

 

Dziękuję za pomoc.

Witam

Nie mam tego problemu podczas dodawania formantu Adobe PDF Reader. Zasadniczo pokazuje mi puste pole, aby wyświetlić ścieżkę do pliku pdf: pdf1.loadfile "c:\xxxx".

Czy program Adobe Reader jest zainstalowany poprawnie? Może też problem z wersją.

Witam

Istnieje dość prosta metoda wstawiania obrazu do formularza użytkownika. Musisz umieścić obszar obrazu w swoim formularzu użytkownika, a następnie przejść do części kodu i zaimplementować to: 

Image1.Picture = LoadPicture("C:\Users\bem1. DIMECOALIPRESSE\Pulpit\TinyStraightMaster\coucou.jpg")

ze ścieżką obrazu w formacie jpg.

Mam nadzieję, że ci pomogłem, powodzenia.

Dimitri. 

1 polubienie

W końcu, po wykonaniu wielu testów, próbowałem znaleźć rozwiązanie polegające na dodaniu kontrolera  "Adobe PDF Reader" do wyświetlania pliku PDF w formularzu użytkownika.

Przerzuciłem się więc na inne możliwe rozwiązanie: dodanie kontrolera  "WebBrowser"

Dostałem się tam z następującym kodem:

Private Sub UserForm_Initialize()

Me.WebBrowser1.Navigate "about:blank"
Me.WebBrowser1.Document.write "<HTML><Body><embed src=""C:\xxxx\xxxxx\xxxxx\test 1.pdf"" width=""100%"" height=""100%"" /></Body></HTML>"

End Sub

 

Ta metoda pokazuje mi plik PDF z Adobe Acrobat Reader DC w formularzu użytkownika, ale problem , który nadal mam, polega na tym, że Adobe Acrobat Reader DC pokazuje mi wszystkie swoje paski narzędzi.

Nie mogę automatycznie wyświetlić pliku PDF w pełnym oknie/na pełnym ekranie (bez pasków narzędzi).

Ktoś ma na to rozwiązanie?

 

Witam

Udało mi się znaleźć rozwiązanie, musisz przejść od parametrów do dokumentu.

W miejsce następującego wiersza kodu:

Me.WebBrowser1.Document.write "<HTML><Body><embed src=""C:\xxxx\xxxxx\xxxxx\test 1.pdf"" width=""100%"" height=""100%"" /></Body></HTML>"

Półmisek:

Me.WebBrowser1.Navigate "C:\xxx\xxx.PDF#pagemode=none"

To właśnie #pagemode=none sprawia, że masz tylko dokument bez interfejsu.

 

Lista parametrów dostępna jest tutaj: http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf

5 polubień

 Dziękuję KVuilleumier !

Kod, który proponujesz, działa, z wyjątkiem czegoś (w moim przypadku), pozwól, że wyjaśnię:

1. Wyświetlane przeze mnie pliki PDF zawierają hiperłącza, które wyświetlają inne pliki PDF,

2. Zdecydowałem się na użycie "Przeglądarki internetowej" do nawigacji (WebBrowser1.GoBack/GoForward), która pozwala mi wyświetlić następujące i poprzednie pliki PDF.

W rezultacie, gdy wybieram łącze hipertekstowe, wyświetlany plik PDF nie jest w trybie pełnoekranowym, jeśli aktualizuję każdy ekran, dodając "#pagemode=brak" do ścieżki wyświetlanego pliku PDF, to nawigacja (WebBrowser1.GoBack/GoForward) przestaje działać.

To, co mi oferujesz KVuilleumier, to już dobry krok naprzód, ale jeśli uda mi się mieć FullScreen i nawigację GoBack/GoForward, byłoby świetnie.

Czy miałby sposób, aby przypisać to <pagemode=none> do przeglądarki (WebBrowser1), a nie do pliku pdf, który ma być wyświetlany? (Jeszcze mi się to nie udało)

 

Witam

Możliwość przetestowania kodu?

2 polubienia

Nie znam Twojego poziomu w VBA, ale zawsze masz możliwość samodzielnego napisania funkcji GoBack i GoForward poprzez zapamiętywanie linków (zdarzenie Scratch the WebBrowser). W ten sposób, gdy klikniesz w link, masz możliwość odświeżenia poprzez dodanie trybu strony, a następnie, aby wrócić, użyj swojej funkcji.

1 polubienie

Witam

Cyril.f, zamierzam umieścić trochę kodu, abyś mógł przetestować.

KVuilleumier, to właśnie zrobiłem: sam napisałem   funkcje GoBack i GoForward.

Z drugiej strony nadal mam problem z wyświetlaniem linków hipertekstowych. Oto mój kod:

Private Sub UserForm_Initialize()

     'J-affiche le 1ere PDF'
     WebBrowser1.Navigate "C:\xxx\xxx\test.PDF#pagemode=none"

End Sub

'------------------------------------------------------------------------------------'

Private Sub WebBrowser1_TitleChange(ByVal Text As String)

    'Si l-URL ne contient pas "#pagemode=none", je l-ajout et recharge la page'
    If Right(WebBrowser1.LocationURL, 14) <> "#pagemode=none" Then
        WebBrowser1.Navigate2 (WebBrowser1.LocationURL & "#pagemode=none")
    End If

End Sub

 

Po wybraniu hiperłącza wyświetlany jest nowy plik PDF, ale nie w pełnym oknie/na pełnym ekranie.

Z drugiej strony, jeśli po wyświetleniu nowego pliku PDF kliknę przycisk CommandButton, który uruchamia odświeżanie , plik PDF umieści go w pełnym oknie/ekranie.

Private Sub CommandButton1_Click()

    WebBrowser1.Refresh

End Sub

Próbowałem więc przeciągnąć  tę przeglądarkę WebBrowser1.Refresh wszędzie, aby wyświetlić całe okno/ekran  bez konieczności klikania przycisku. Ale nie ma mowy, nie mogłem tego zrobić. 

Być może używam niewłaściwego zdarzenia WebBrowser, ale myślę, że przetestowałem prawie wszystko.

Ktoś ma rozwiązanie?

 

Kuriozalne wydarzenie:

W porównaniu do wcześniej przedstawionego kodu, jeśli dodam WebBrowser1.Refresh  w zdarzeniu WebBrowser (tuż przed End If) nie działa, ale jeśli dodam również Msgbox "ok" (tuż przed WebBrowser1.Refresh) to działa po zamknięciu MsgBox.

Kod:

Private Sub UserForm_Initialize()

     'J-affiche le 1ere PDF'
     WebBrowser1.Navigate "C:\xxx\xxx\test.PDF#pagemode=none"

End Sub

'------------------------------------------------------------------------------------'

Private Sub WebBrowser1_TitleChange(ByVal Text As String)

    'Si l-URL ne contient pas "#pagemode=none", je l-ajout et recharge la page'
    If Right(WebBrowser1.LocationURL, 14) <> "#pagemode=none" Then
        WebBrowser1.Navigate2 (WebBrowser1.LocationURL & "#pagemode=none")
        MsgBox "ok"
        WebBrowser1.Refresh    
    End If

End Sub

 Bardzo dziwne, prawda?

Witam

Zamiast wyświetlać plik PDF, a następnie sprawdzać, czy jest na pełnym ekranie, dlaczego nie wykonasz testu przed jego wyświetleniem?

Dim Adresse As String
    
Adresse = "C:\xxx\xxx\test.PDF"
    
If Right(Adresse, 14) <> "#pagemode=none" Then
   Adresse = (Adresse & "#pagemode=none")
End If
    
WebBrowser1.Navigate Adresse

Pozdrowienia

Witam

D.Roger, zgadzam się na ciebie, byłoby wspaniale, gdybym mógł to zrobić, ale w moim przypadku mi się nie udało.

Przypomnienie mojego przypadku: wyświetlam 1. plik PDF na pełnym ekranie (na razie nie ma problemu). Ten plik PDF zawiera hiperłącza, które wyświetlają inne pliki PDF, a kliknięcie jego hiperłączy uniemożliwia wyświetlenie nowych plików PDF na pełnym ekranie.

W tym, co proponujesz (jeśli dobrze zrozumiałem), powinienem być w stanie zatrzymać przekierowanie WebBrowser1.Navigate, gdy kliknę na hiperłącze podczas pobierania ścieżki, którą zwraca hiperłącze, aby je zmodyfikować (dodaj "#pagemode=brak") i ponownie uruchomić WebBrowser1.Navigate z nową zmodyfikowaną ścieżką.

Jeśli wiesz, jak to zrobić, udostępnij swój kod STP.

 

Witam

Nie wiem wystarczająco dużo o tego typu kontrolce i niestety nie mam do zaoferowania żadnego kodu, potrzebowałbym kodu twoich funkcji GoBack i GoForward, aby zobaczyć ...

Z drugiej strony, jeśli chodzi o twoje "Strange Event" to nie jest takie dziwne, próbujesz odświeżyć swoją stronę przed końcem jej ładowania, twój Msgbox "ok" (tuż przed WebBrowser1.Refresh) służy jako tempo, zastąp go na:

While WebBrowser1.ReadyState <> READYSTATE_COMPLETE Or WebBrowser1.Busy = True
    DoEvents
Wend

Dzięki temu możesz poczekać, aż strona zakończy ładowanie przed odświeżeniem.

Pozdrowienia

3 polubienia

 Dziękuję d.roger,

To jest to, czego mi brakowało, poza tym, że w moim kodzie pętla While/Wend wyrzuca błąd, więc użyłem pętli Do Until/Loop:

Do Until WebBrowser1.ReadyState = READYSTATE_COMPLETE Or WebBrowser1.Busy = False
   DoEvents
Loop

 

Witam

Aby uniknąć błędu w pętli while, możesz również umieścić tylko:

WhileTrue
    DoEvents
Wend

do otwierania lokalnych plików PDF oraz:

While WebBrowser1.ReadyState <> READYSTATE_COMPLETE
    DoEvents
Wend

Do wyświetlania stron internetowych, jeśli to konieczne, stron, które są lepiej zabronione w makrze, chyba że zostaną podjęte wszystkie zabezpieczenia związane z przeglądaniem Internetu.

Do testów dołączam również fragment makra, który pozwala wyświetlić plik PDF w kontrolce "Adobe PDF Reader" odpowiadającej Twojemu początkowemu żądaniu, musisz go edytować i zmienić wiersz LoadPDF "C:\xxx\xxx.PDF#pagemode=none", 1, aby umieścić ścieżkę do pliku PDF.

Pozdrowienia


macroadobepdfreader.swp