Adobe PDF in WebBrowser darstellen

  • VB.NET
  • .NET (FX) 4.0

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

    -Franky- schrieb:

    Funktioniert denn, wenn Du ein PDF (oder auch andere Dateien) im Explorer anklickst
    Vom Explorer aus weerden (alle) PDFs im Adobe Reader geöffnet.
    Wenn ich sie auf den Firefox ziehe, werden sie dort geöffnet, im Edge werden sie auch anstandslos geöffnet.
    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

    Die wichtige Frage ist, funktioniert die Vorschau im Explorer? Wenn im Explorer ebenfalls keine Vorschau möglich ist (Register Ansicht -> Vorschaufenster), dann kann mein Code das auch nicht. Ansonsten wüsste ich nicht warum das bei einigen nicht funktioniert außer das kein entsprechender PreviewHandler, passend für die Datei, registriert ist.

    @RodFromGermany Nicht doppelklick im Explorer! Es gibt ein Vorschaufenster im Explorer -> Register Ansicht -> Vorschaufenster aktivieren. Dann nur Datei im Explorer anklicken.
    Mfg -Franky-
    @Dksksm

    Wait a second.... Da fällt mir doch was ein, wo ich "Adobe Acrobat DC (64-bit)" lese, was ich seiner Zeit, als ich den Code zusammen gebastelt habe, irgendwo gelesen hatte. Der PreviewHandler vom AcrobatReader kann da sehr zickig sein. Stell mal von Any-CPU auf 64bit um. Vllt bringt es ja was.
    Mfg -Franky-

    -Franky- schrieb:

    Es gibt ein Vorschaufenster im Explorer -> Register Ansicht -> Vorschaufenster aktivieren. Dann nur Datei im Explorer anklicken.
    Das funktioniert mit beiden Dateien.
    ====
    Ich benutze den Explorer nicht, ich habe meinen Salamander mit 2 Datei-Panels.
    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!
    Danke @-Franky- für den Vorschau-Code. Echt gut, was der alles im Preview zeigen kann (Word, Powerpoint usw.) - doch leider keine PDFs. Da geht es mir gleich, wie manchen anderen, die in diesem Forumsbeitrag schreiben. @Dksksm hat ja die Feststellung gemacht, dass es einen scheinbaren Zusammenhang mit dem Adobe Reader gibt. Nur brauche ich den häufig als Standard-PDF-Programm und kann diesen deshalb nicht deinstallieren.

    Danke @Dave26 für dein Video. Spannend, dass das bei dir auf Anhieb geht. Ich kriege die erste graue Darstellung im WebBrowser nach wie vor nicht weg.
    @icewather
    Danke @Dave26 für dein Video. Spannend, dass das bei dir auf Anhieb geht. Ich kriege die erste graue Darstellung im WebBrowser nach wie vor nicht weg.


    Bei meinem Video habe ich das Webbrowser-Control verwendet ;-).
    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
    @icewather

    Ja schade das sich der PreviewHandler vom AcrobatReader so zickig anstellt. Selbst mit meinem VB6 Code hab ich keine Probleme PDFs darüber anzuzeigen. Evtl wird das im Windows Api Code Pack ja anders gelöst obwohl dort die gleichen Interfaces verwendet werden. Wenn man das Internet zu diesem Problem durchforstet, findet man sehr viele Treffer im Zusammenhang mit dem AcrobatReader. Vllt findet man ja da eine Lösung zu.
    Mfg -Franky-

    -Franky- schrieb:

    @icewather

    Ja schade das sich der PreviewHandler vom AcrobatReader so zickig anstellt. Selbst mit meinem VB6 Code hab ich keine Probleme PDFs darüber anzuzeigen. Evtl wird das im Windows Api Code Pack ja anders gelöst obwohl dort die gleichen Interfaces verwendet werden. Wenn man das Internet zu diesem Problem durchforstet, findet man sehr viele Treffer im Zusammenhang mit dem AcrobatReader. Vllt findet man ja da eine Lösung zu.

    Würde ich cool finden. Dann wäre dein Code-Vorschlag perfekt!!

    -Franky- schrieb:

    Ja schade das sich der PreviewHandler vom AcrobatReader so zickig anstellt.
    Kann das an der Adobe-Versionliegen?
    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

    RodFromGermany schrieb:

    Kann das an der Adobe-Versionliegen?

    Das kann ich Dir nicht wirklich beantworten. Ich komme gerade nicht an meinen PC, wegen Urlaub, ran um zu schauen welche AdobeReader DC Version (32 oder 64bit) ich da installiert habe. Der Explorer selber kann ja anscheinend damit umgehen. Das Problem ist, ich kann es ja nicht nachvollziehen warum es bei einigen nicht funktioniert da es ja bei mir, und anscheinend bei Dive26 auch, funktioniert. Sogar mein VB6 Code dazu funktioniert mit dem AcrobatReader als PreviewHandler. Als ich die Codes seiner Zeit zusammengebaut hatte, hatte ich in .NET halt nur das Problem mit dem Häkchen "32bit bevorzugen" bei Any-CPU wenn das ganze auf einem 64bit Windows ausgeführt wird. Wenn mir dieses Problem bereits vorher aufgefallen wäre, hätte ich hier nicht den Vorschlag für icewather gemacht, das per PreviewHandler zu lösen.

    Der einzige Unterschied zwischen VB6 und .NET ist die Erstellung der Interfaces.
    In .NET halt per

    VB.NET-Quellcode

    1. Activator.CreateInstance(Type.GetTypeFromCLSID(New Guid(strHandlerClsid)))

    und in VB6 per

    Visual Basic-Quellcode

    1. If CoCreateInstance(VarPtr(Str2Guid(strCLSID_Handler)), 0&, _
    2. CLSCTX_LOCAL_SERVER, VarPtr(Str2Guid(IID_IPreviewHandler)), _
    3. m_pIPreviewHandler) = S_OK Then

    In VB6 war hier halt nur wichtig das die Erstellung des Interfaces IPreviewHandler per CLSCTX_LOCAL_SERVER erfolgen muss damit der AdobeReader nicht rumzickt. Der Rest ist in beiden Codes fast gleich was dann die Initialisierung und das Anzeigen angeht. Vllt gibt es in .NET ja auch die Möglichkeit zu sagen, das das für den IPreviewHandler per CLSCTX_LOCAL_SERVER erfolgen muss. Die anderen Interfaces wie zB IThumbnailProvider werden per CLSCTX_INPROC_SERVER initialisiert. Das sind auch so die Vorschläge im Internet wenn man nach dem Problem IPreviewHandler im Zusammenhang mit dem AcrobatReader sucht.

    Zusatz: hab eben nochmal etwas das Inet durchforstet. Activator.CreateInstance nutzt anscheinend CLSCTX_ALL zum erstellen von Interfaces. Eine Mögliche Lösung könnte das hier sein: stackoverflow.com/questions/22…de-and-garbage-collection Hier wird ebenfalls CoCreateInstance genutzt wobei man hier zwischen CLSCTX_LOCAL_SERVER und CLSCTX_INPROC_SERVER bei der Erstellung der Interfaces umschalten kann.
    Mfg -Franky-

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

    -Franky- schrieb:

    In VB6
    Nicht, dass da eine veraltete VB6-Deklaration Schuld dran ist.
    Ich werde mir mal "das Ding" genauer ansehen.
    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

    RodFromGermany schrieb:

    Nicht, dass da eine veraltete VB6-Deklaration Schuld dran ist.

    Das glaub ich nicht. Es geht hier nur um das erstellen des Interfaces IPreviewHandler der für PDFs, DOC, XLS usw zuständig ist. Da gibt es schon Unterschiede ob per CLSCTX_ALL oder nur CLSCTX_LOCAL_SERVER oder nur CLSCTX_INPROC_SERVER verwendet wird. Das hat ja jetzt nichts mit irgendeiner API oder VB6 zu tun. Das sind halt nur die Sachen, die mir seiner Zeit aufgefallen und auch so im Internet beschrieben sind. Activator.CreateInstance dürfte intern auch nur die API CoCreateInstance aufrufen. Halt nur mit dem falschen CLSCTX_-Parameter.

    Zusatz: Hab mal den Vorschlag von SO bei mir eingebaut. Das hier kommt halt noch dazu.

    VB.NET-Quellcode

    1. Private Const CLSCTX_LOCAL_SERVER As Integer = 4
    2. Private Const CLSCTX_INPROC_SERVER As Integer = 1
    3. Private Const IID_IUnknown As String = "00000000-0000-0000-C000-000000000046"
    4. <DllImport("Ole32.dll", EntryPoint:="CoCreateInstance")>
    5. Private Shared Function CoCreateInstance(<[In], MarshalAs(UnmanagedType.LPStruct)> ByVal rclsid As Guid,
    6. <[In], MarshalAs(UnmanagedType.IUnknown)> ByVal pUnkOuter As Object,
    7. <[In]> dwClsContext As Integer,
    8. <[In], MarshalAs(UnmanagedType.LPStruct)> ByVal riid As Guid,
    9. <Out, MarshalAs(UnmanagedType.[Interface])> ByRef rReturnedComObject As Object) As Integer
    10. End Function
    11. Private Function CreateInstance(clsid As Guid, localServer As Boolean) As Object
    12. Dim unk As Object = Nothing
    13. If CoCreateInstance(clsid, Nothing, If(localServer, CLSCTX_LOCAL_SERVER,
    14. CLSCTX_INPROC_SERVER), New Guid(IID_IUnknown), unk) = S_OK Then
    15. Return unk
    16. End If
    17. Return Nothing
    18. End Function

    und entsprechend in der Funktion ShowPreview eine Zeile ersetzt

    VB.NET-Quellcode

    1. ' Versuche einen PreviewHandler für IPreviewHandler zu finden
    2. If GetHandlerClsidFromFile(m_PreviewFile, IID_IPreviewHandler, strHandlerClsid) Then
    3. ' PreviewHandler erstellen
    4. 'm_PreviewHandler = Activator.CreateInstance(Type.GetTypeFromCLSID(New Guid(strHandlerClsid)))
    5. m_PreviewHandler = CreateInstance(New Guid(strHandlerClsid), True)

    Läuft bei mir natürlich auch. Ich muss aber auch dazu sagen das ich auf meinem Laptop kein AdobeReader, sondern Foxit, installiert habe. Wer mag und wo es bisher nicht funktioniert hat, kann es mit diesen Änderungen mal testen.
    Mfg -Franky-

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „-Franky-“ ()

    @Dksksm
    Na das sind doch mal gute Nachrichten. Aber das das erst beim 2 Anlauf nach Start geht, ist wieder so ein Ding das ich nicht nachvollziehen kann.

    Die Frage ist doch eher, warum können die PreviewHandler zB. für DOC, XLS, MP3, PDF wenn der Foxit verwendet wird, ganz normal per Activator.CreateInstance initialisiert werden und der PDF Handler vom AcrobatReader nur per CLSCTX_LOCAL_SERVER? Ich vermute ja eher das der PreviewHandler vom AdobeReader einfach kac...., sorry, Schrott ist. Denn nur dieser macht ja solche zicken.
    Mfg -Franky-
    Hi

    Na vllt. hat ja jemand Lust und Zeit das ganze nochmal komplett neu zu programmieren. Für mich war es ja auch nur ein Proof of concept und im groben funktioniert es ja auch wenn da nicht der AdobeReader querschießen würde. Also von mir aus, macht was aus dem Code. ;)
    Mfg -Franky-
    Tja, den Skill habe ich bei weitem nicht. Für mich würde es so auch reichen, habe es unter C# zum Laufen bekommen und versuche den Code nachzuvollziehen.
    pinvoke zeigt zumindest für C# eine andere Signature und das Ergebnis wird in die Struktur MULTI_QI geschrieben, aber nicht mal die Änderungen am Code habe ich hinbekommen.

    Grafiken (Filme als Bild) und Text, auch wenn es .reg ist werden sauber angezeigt, PDF auch, bei Adobe als Viewer halt erst im 2. Anlauf.
    Frage: Kann man nicht auch Office / OpenOffice-Dateien vorschauen lassen? AssocQueryStringW in der Funktion GetHandlerClsidFromFileExt liefert keine GUID zurück.
    Andererseits zeigt der Explorer aber dennoch für beide Varianten Vorschauen an, obwohl "nur" MS Office installiert ist.

    Wie gesagt, für meine Werkzeuge reicht das aus, weil ich brauch das nur für Screenshots und Text- oder PDF-Dateien. - Und das kann es ja :)

    -Franky- schrieb:

    Wenn im Explorer ebenfalls keine Vorschau möglich ist (Register Ansicht -> Vorschaufenster), dann kann mein Code das auch nicht.


    Also sowohl das Vorschau-Fenster des Explorers funktioniert, wie auch wenn ich Ansicht->Extra große Symbole auswähle(Datei-Icon). Kann es vllt. sein das man die "Pro" version vom Adobe braucht?