Adobe PDF in WebBrowser darstellen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 43 Antworten in diesem Thema. Der letzte Beitrag () ist von Dksksm.

    Adobe PDF in WebBrowser darstellen

    Ich möchte ein PDF darstellen und tue das mit dem einfachen Befehl: WebBrowser.Navigate(vFile, False)
    Dabei geschieht etwas merkwürdiges: Beim der ersten Darstellungsversuch (Mausklick auf einen Eintrag in einem ListView) färbt sich der WebBrowser grau ein. Beim zweiten Klick auf die gleiche Stelle wird das PDF tadellos dargestellt. Ich hänge drei Dateien dazu an.

    Ich habe buchstäblich Stunden recherchiert und folgende Lösungen getestet:

    VB.NET-Quellcode

    1. WebBrowser.Navigate("About:Blank#zoom=100%")
    2. WebBrowser.Navigate(vFile, False)
    3. WebBrowser.Refresh(3) (3 steht für Complitly-Refresh, d.h. die Seite wird neu und nicht aus dem Speicher eingelesen)
    4. Windows.Forms.Application.DoEvents()
    5. Me.Refresh()


    Dann habe ich die Windows-Einstellungen unter Internetoptionen durchbuchstabiert und auch dort nichts gefunden.
    Weiter: Ich habe das Com-Steuerelement von Adobe Reader eingebunden und mit AxAcroPDF1.src = vFile das Binding zum PDF hergestellt

    Fazit: Kein einziger Versuch hat geholfen. Ob mit dem WebBrowser, dem Com-Steuerelement - beim ersten Klick bleibt die Darstellung grau. Beim zweiten Klick wird das PDF bestens dargestellt.
    Ich verzweifle nicht gerade, habe aber echt keine Idee mehr, wie ich das hinkriegen könnte!
    Hat jemand einen Tipp?
    Ganz herzlichen Dank!

    Bild1: Die PDF-Datei ist nicht angeklickt
    Bild2: Nach erstem Klick auf die PDF-Datei in ListView
    Bild3: Nach zweiten Klick auf die PDF-Datei in ListView (der zweite Klick auch auf eine andere PDF-Datei erfolgen, wenn es mehrere in der Liste hat und sie würde korrekt dargestellt)

    Thema verschoben; Das Thema wird automatisch dort erstellt, wo man sich befindet, wenn man auf [* Neues Thema] klickt.
    CodeTags gesetzt ~VaporiZed
    Bilder
    • Bild1.jpg

      256,34 kB, 2.180×754, 124 mal angesehen
    • Bild2.jpg

      262,57 kB, 2.178×757, 119 mal angesehen
    • Bild3.jpg

      291,33 kB, 2.176×756, 110 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Hi

    Wenn es Dir nur um die Anzeige von PDFs, oder auch anderen Dateiformaten wie DOC(X), XLS(X) und so weiter, geht, dann würde ich den entsprechenden, dafür registrierten, PreviewHandler (docs.microsoft.com/en-us/windo…jidl_core-ipreviewhandler) verwenden. Dazu liest Du aus der Registry, passend zur Dateiendung, die CLSID für zB den Handler IID_IPreviewHandler, IID_IThumbnailProvider oder IID_IExtractImage aus. Die ausgelesene CLSID wird per Activator.CreateInstance geladen und muss dann, je nachdem was dieser PreviewHandler unterstützt, per IStream, per IShellItem oder per File initialisiert werden. Je nachdem um welchen Type PreviewHandler es sich handelt (IID_xxx) entsprechend die Vorschau laden. Für IID_IPreviewHandler dann per IPreviewHandler.SetWindow ein FensterHandle und Position zuweisen, evtl noch ein IPreviewHandler.SetRect hinterher und das ganze per IPreviewHandler.DoPreview anzeigen und per IPreviewHandler.Unload am Ende wieder schließen. Das ganze ist im Prinzip das, was der Explorer auch für die Vorschau verwendet.

    Nun kann man das ganze selbst programmieren (Beispiele dazu findest haufenweise im Internet), oder man lädt sich das "Microsoft Windows API CodePack" dafür herunter. Oder man schaut hier (github.com/aybe/Windows-API-Co…xtensions/PreviewHandlers) wie das ganze im API Codec Pack eingebaut ist und programmiert dieses nach.
    Mfg -Franky-
    @icewather Dieser Code funktionjiert bei mir einwandfrei:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. WebBrowser1.Navigate(TextBox1.Text, False)
    4. End Sub
    5. End Class
    Probiere folgende Schreibweisen aus:
    D:\Temp\Test.pdf
    "D:\Temp\Test.pdf"
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    [/vbnet][/spoiler]Probiere folgende Schreibweisen aus:
    D:\Temp\Test.pdf
    "D:\Temp\Test.pdf"[/quote]

    Das geht leider beides nicht. Macht keinen Unterschied.

    -Franky- schrieb:

    Nun kann man das ganze selbst programmieren (Beispiele dazu findest haufenweise im Internet), oder man lädt sich das "Microsoft Windows API CodePack" dafür herunter. Oder man schaut hier (github.com/aybe/Windows-API-Co…xtensions/PreviewHandlers) wie das ganze im API Codec Pack eingebaut ist und programmiert dieses nach.
    Danke Franky - doch da bin ich glatt überfordert! Es wäre so einfach mit dem WebBrowser, wenn es funktionieren würde. Um deinen Vorschlag umsetzen zu können, müsste ich einen konkreten VB.NET Beispielcode haben. Ansonsten habe ich keine Chance... Sorry

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „icewather“ ()

    @icewather

    icewather schrieb:

    doch da bin ich glatt überfordert!

    Ich hab hier mal ein ganz altes VB.Net Projekt von mir hochgeladen das zeigt, wie das mit den PreviewHandler funktioniert. Ist sozusagen ein Proof of concept Code. Wie gesagt, ist schon ein paar Jahre alt und kann hier und da sicher noch verbessert werden. Wichtig! In den Projekteigenschaften muss das Häkchen bei Any-CPU -> 32bit bevorzugen raus! Sonst kann es zu Problemen mit dem PDF-PreviewHandler kommen wenn das ganze auf einem 64bit Windows ausgeführt wird. Natürlich muss auch ein PreviewHandler für die entsprechenden Dateien vorhanden sein. Unter Win10 ist das für PDF standardmäßig der Edge falls kein anderes Programm als Standardbetrachter für PDF eingerichtet ist. Ist zb der AcrobatReader als Standardbetrachter für PDF eingerichtet, wird der PreviewHandler vom AcrobatReader verwendet. Sofern der PreviewHandler nicht vom User in den AcrobatReader-Eigenschaften deaktiviert wurde! Probiere es einfach aus. Wenn der Explorer ein PDF in der Vorschau anzeigen kann, kann der VB.NET Code das auch.

    icewather schrieb:

    Es wäre so einfach mit dem WebBrowser, wenn es funktionieren würde.

    Naja, ein Webbrowser ist für das anzeigen von Websites zustandig. Du lädst doch in .NET auch keine Word-Instance um ein Text-File anzuzeigen. ;)
    Dateien
    • PreviewFile.zip

      (29,96 kB, 132 mal heruntergeladen, zuletzt: )
    Mfg -Franky-
    @-Franky- Den OpenFileDialog rufe ich so auf:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Using dlg = New OpenFileDialog
    3. dlg.Title = "Open File for Preview"
    4. dlg.FileName = String.Empty
    5. If dlg.ShowDialog() = DialogResult.OK Then
    6. FilePreviewControl1.PreviewFile = dlg.FileName
    7. FilePreviewControl1.ShowPreview()
    8. End If
    9. End Using
    10. End Sub
    Wenn ich da eine JPG-Datei auswähle, bleibt das Programm ohne Meldung stehen, wenn das 32-Bit bevorzugen Häkchen fehlt.
    In diesem Zustand knallt leider der PDF-Preview.
    Eine simple 2-zeilige vom Notepad aus gedruckte Text-Datei kann leider nicht dargestellt werden.

    Ziehe ich das Fenster in y-Rictung, wird die Vorschau gelöscht.
    ;(
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Hmm, ich kann deine Problem nicht nachvollziehen. PDFs, JPGs usw werden bei mir anstandslos geladen und angezeigt und die Vorschau verschwindet auch nicht wenn ich das Fenster in y-Richtung ziehe.
    Mfg -Franky-
    @-Franky- Merkwürdig.
    W10 21H1 (19043.1415)
    VS 2019 Community V 16.11.8
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Bei mir wird nichts angezeigt. Das Problem mit dem verschieben trat bei mir ein mal auf, dann stand da keine Vorschau geladen anstatt von keine Vorschau möglich. Hab mehrere PDFs probiert.

    W10 21H1 19044.1415
    VS 2022 Community, Version 17.0.4
    Bilder
    • Unbenannt.jpg

      71,1 kB, 1.091×760, 93 mal angesehen
    Das Problem mit dem Anzeigen im Webbrowser ist die benutzerspezifische Einstellung des Webbrowsers.
    Ich z.B. habe auf meinem Rechner meine Webbrowser so konfiguriert, dass eine PDF-Datei nicht im Browser dargestellt wird, sondern sofort auf den Desktop gespeichert. Da würde Dein Code gar nicht funktionieren.

    Leider habe ich auch noch keine akzeptable Lösung gefunden eine existierende PDF-Datei in einem Control in der Anwendung anzuzeigen.

    Ok, es gibt diverse Komponenten die eine PDF-Seite in eine Image-Datei umwandeln, aber was macht man dann bei mehrseitigen Dokumenten? Bei einem z.B. 100-seitigen Handbuch würde außerdem das konvertieren ettliche Minuten dauern.

    Daher verwende ich einfach Process.Start ("test.pdf") um die PDF-Datei mit dem default-PDF-Anzeiger auf dem Rechner zu starten. Somit hat der User das PDF in seinem bevorzugten PDF-Viewer ausgegeben.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @RodFromGermany

    Wie gesagt, ich kann das Problem nicht nachvollziehen. Siehe Screenshots.
    Win10 64bit 20H2 (19042.1288)
    Microsoft Visual Studio Community 2019 Version 16.11.8

    Ansonsten könnt Ihr ja mal das "Microsoft-WindowsAPICodePack" ausprobieren. Da ist ja ebenfalls die Geschichte mit dem PreviewHandler enthalten.
    Bilder
    • OpenDialog.png

      13,57 kB, 843×180, 95 mal angesehen
    • Preview.png

      100,51 kB, 1.010×685, 120 mal angesehen
    Mfg -Franky-
    Hast Du auch schon ein anderes PDF ausprobiert? Vielleicht ist dieses "fehlerhaft" oder enthält nicht unterstützte Elemente.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Ich habe mit einem elementar einfachen und einem relativ komplexen PDF getestet, beide wollten nicht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Ich habe mit einem elementar einfachen und einem relativ komplexen PDF getestet, beide wollten nicht.


    Ich habe, nachdem ich diesen Thread heute gelesen hatte, das mit dem Webbrowser als PDF-Anzeige ausprobiert.
    Bei mir hat er alle PDF-Dateien angezeigt. Darunter waren normale A4-Seiten, mehrseitige PDFs, aber auch ein komplexer A2-Hausbau-Plan.

    Ich habe das in meiner Anwendung an der ich aktuell arbeite mal testweise eingebaut und ein Video gemacht: bonit.at/videos/WebBrowserPDF.mp4
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „dive26“ ()

    dive26 schrieb:

    das mit dem Webbrowser als PDF-Anzeige ausprobiert.
    Das läuft bei mir auch.
    Hier ging es um das Preview-Control von @-Franky- .
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Hier ging es um das Preview-Control von @-Franky- .


    Achso. Aber das funktioniert bei mir auch anstandslos. Habs gerade heruntergeladen, in VS geöffnet, gestartet und es funktionierte mit allen meinen PDFs.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    dive26 schrieb:

    und es funktionierte mit allen meinen PDFs.
    Das unterscheidet uns. ;(
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi

    Ich hab das eben nochmal auf meinem Laptop (gleiches OS und VS wie ich das hier schon angegeben hatte) ausprobiert. Auch hier läuft das anstandslos. Einziger Unterschied: Auf dem PC ist der AcrobatReader und auf dem Laptop der Foxit Reader als Standardbetrachter für PDFs eingerichtet. Auch andere Dateien (Bilder, Office Dokumente usw, Audio und Video-Dateien) lassen sich darüber anzeigen / abspielen.

    @RodFromGermany Funktioniert denn, wenn Du ein PDF (oder auch andere Dateien) im Explorer anklickst, die Vorschauanzeige im Explorer? Wenn es im Explorer nicht funktioniert, dann funktioniert mein Code natürlich auch nicht da der Code die gleichen Interfaces für die Preview verwendet wie der Explorer.
    Mfg -Franky-
    Das Programm von @-Franky- zeigt bei mir kein einziges PDF in der Vorschau an.

    Nachtrag: So ich hatte, wie Frankie schrieb, auf meinem PC den "Adobe Acrobat DC" als Standardprogramm. Hab dann den Foxit isntalliert, der hat sich auch gleich als selbst als Standard eingetragen und das Prgramm zeigt jetzt (im Foxit-reader) alle PDFs fein säuberlich an. Nach der De-Installation von Foxit kann wieder kein PDF mit dem Tool angezeigt werden, Vorschau ist wieder nicht möglich.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dksksm“ ()