automatischer Download von PDF-Dateien mit WebView2 [Teil-Workaround gefunden]

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    automatischer Download von PDF-Dateien mit WebView2 [Teil-Workaround gefunden]

    Hallo zusammen.

    Wie kann ich das WebView2-Control so einstellen, dass angeklickte Links zu oder per externem Website-Script automatisch angezeigte PDF-Dateien nicht (nur) angezeigt, sondern (auch) automatisch heruntergeladen werden? Normale Internetbrowser kann ich dazu bringen, aber die passende Einstellung für das WebView2 konnte ich trotz längerer Recherche im Netz nicht finden.

    ##########

    Ich habe auch bemerkt, dass es keinen nur-Speichern-Button bei der PDF-ToolBar gibt.
    Auch habe ich versucht, das Browserverhalten zu verändern, und zwar mit

    VB.NET-Quellcode

    1. Await WebView21.CoreWebView2.CallDevToolsProtocolMethodAsync("Browser.setDownloadBehavior", "{behavior: 'allow'}")
    Aber hier bekomme ich System.ArgumentException: "Der Wert liegt außerhalb des erwarteten Bereichs."und mit

    VB.NET-Quellcode

    1. Await WebView21.CoreWebView2.CallDevToolsProtocolMethodAsync("Browser.setDownloadBehavior", "{""behavior"": ""allow""}")
    bekomme ich System.ArgumentException: "Klasse nicht registriert"
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Danke, das kenn ich schon. Ich will aber was haben, was nicht da ist. Ich habe bereits Microsoft.Web.WebView2.Core.CoreWebView2PdfToolbarItems.None eingestellt, sodass vermeintlich nichts ausgeblendet wird, also alles angezeigt wird. Ein nur-Speichern gibt es leider nicht. Es kommt beim angezeigten Button (Disketten-/Speichern-Symbol) immer der Speichern unter Dialog.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich kenne das Webview nicht. In der Doku(für Methode CoreWebView2.CallDevToolsProtocolMethodAsync) wird hierhin verwiesen:
    chromedevtools.github.io/devto…ethod-setDownloadBehavior

    Dort ist das ja dokumentiert, welche Parameter nutzbar sind. Sind optionale Optionale möglich, der 2. musst du mal gucken, der 3. ist vorraussetung in deinem Fall(default path)
    downloadPath string The default path to save downloaded files to. This is required if behavior is set to 'allow'
    or 'allowAndName'.



    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Auch damit bekomm ich es nicht zum Laufen. Auch nicht mit deny. Vielleicht verwende ich die Syntax falsch und ich schreibe falschen JSON-Text :/
    Habe es schon mit IO.File.ReadAllText und folgendem Dateiinhalt probiert:

    Quellcode

    1. {"behavior": "deny"}

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Weiß nicht obs es dir weiterhilft, aber in der Doku steht:
    "downloadPath - The default path to save downloaded files to. This is required if behavior is set to 'allow'
    or 'allowAndName'."
    Kann es sein, dass du das überlesen hast?

    EDIT: Sorry hab übersehen, dass DTF das in seinem Post schon hatte

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

    Nein, das hatte schon DTF geschrieben. Ich bekomme es mit Pfadangabe auch nicht zum Laufen. Auch nicht mit deny, welches ja keinen Parameter mehr erfordert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Kein Ahnung. Probier mal so wie der hier: (Die { und } doppelt)
    stackoverflow.com/questions/66…ith-fetch-continuerequest

    Der hatte ja erfolg, wenn dann immer noch das Problem mit der nicht registrierten Klasse vorliegt, könnte ein COM Problem vorliegen. Auch ist das laut chromedevtools.github.io auch experimentell, kann auch das Problem sein.


    Ups, das ist ja ein interpolierter String,
    Hast du also schon probiert, hatte erst nicht drauf geachtet das der string interpoliert wird. Da kann man nur im trüben Fischen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „DTF“ ()

    Also ich bekomme es auch nicht zum laufen. Hier hat jemand das gleiche Problem mit anderer Fehlermeldung. Ein möglicher Workaround wäre den Download mit JS zu starten.

    Spoiler anzeigen

    C#-Quellcode

    1. webView21.NavigationCompleted += async (s, ev) => {
    2. if (ev.IsSuccess && webView21.CoreWebView2.Source.EndsWith(".pdf"))
    3. {
    4. string script = @"
    5. const fileName = window.location.href.split('/').at(-1);
    6. const link = document.createElement('a');
    7. link.setAttribute('href', window.location.href);
    8. link.setAttribute('download', fileName);
    9. document.body.appendChild(link);
    10. link.click();
    11. link.remove();
    12. ";
    13. await webView21.ExecuteScriptAsync(script);
    14. }
    15. };

    Auch mit doppelten Klammern klappt es nicht :cursing:
    Das gibt einen neuen Report bei Microsoft …

    ##########

    @Fakiz: Das mit dem Download klappt vorerst auch nicht, was aber an mir liegt.
    Ich bin ganz froh, dass ich meine Zielseite erstmal automatisch öffnen und mich dort automatisch anmelden kann und dann ein Button geklickt wird, der mit zur Quelle der gewünschten PDFs (Rechnungen) führt. Recht umständlich, aber der Zugriff auf die Rechnungen ist seitenintern mit einem temporären Zugriffskey versehen. Das führt aber dann dazu, dass ein neues Fenster geöffnet, in dem eine Liste der PDFs gezeigt wird. Das ausgewählte wird dann als Preview angezeigt. Aufgrund des neuen Fensters hab ich erstmal über den Code keinen Zugriff mehr darauf. Es wird zwar ein Event (NewWindowRequested) gefeuert, aber so spät am Abend wollte ich dann nicht mehr recherchieren, was da alles wieder gemacht werden muss, um eben genau dieses neue Fenster (was vom Typ CoreWebView2 ist), auch zu erhalten, um Zugriff darauf zu nehmen. Die naheliegende Annahme, dass es einfach in den EvetArgs drinsteckt, war falsch. Da ist nämlich erstmal NewWindow = Nothing
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Nach einer Anfrage beim WebView2-Entwicklerteam kam raus, dass ein anderer User den Vorschlag macht, es über eine JavaScript-Funktion durchzuführen.

    VB.NET-Quellcode

    1. WebViewInstance.CoreWebView2.ExecuteScriptAsync("window.open('hier der Link zur PDF')")
    Klappt zwar, aber vorerst recht enttäuschend, wenn das (noch) nicht von Haus aus vorgesehen ist. Außerdem gibt es Seiten, die selber wiederum JS nutzen, um PDFs anzuzeigen, sodass ich keine Links bekomme, die ich mit der JS-Funktion aufrufen kann. Naja …
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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