none
Webbrowser – Zoom-Funktion bei Anzeige von PDF, XPS und anderen Dateiformaten RRS feed

  • Frage

  • Hallo,

    ich stelle in einer WPF-Anwendung Inhalte in zwei getrennten Webbroser-Fenstern dar. Diese Inhalte sind in aller Regel PDF-oder XPS-Dateien, die über das Adobe-Control bzw. den XPS-Viewer dargestellt werden. Bilddateien (z. B. JPG, PNG usw.) werden so wie auch HTML-Inhalte nativ im Webbrowser dargestellt.

    Es funktioniert alles gut, aber ich schaffe es nicht, den dargestellten Inhalt an die Fensterbreite bzw. -höhe anzupassen. Ich kann zwar mit der Maus (Strg+Mausrad) oder mit der Tastatur (Strg++ bzw. Strg+-) die Inhalte an die gewünschte Größe anpassen (Zoomen), aber wie mache ich das im Programmcode?

    Ich hoffe, es gibt dafür eine Lösung.

    Lieben Dank im Voraus!
    Montag, 18. März 2019 22:07

Antworten

  • Danke! Das Problem habe ich gelöst, allerdings schön ist was anderes. Hier die Methode, die das macht:


            public static void SetZoom(this WebBrowser wb, ISEdoc isedoc, string Source, ref int Zoom)
            {
                if (Zoom < 20)
                {
                    Zoom = 20;
                }
                else if (Zoom > 400)
                {
                    Zoom = 400;
                }
    
                if (isedoc.dts.DocumentType(Source) == c.DocType.PDF)
                {
                    var doc = wb.Document as AcroPDFLib.AcroPDF;
                    doc.setZoom(Convert.ToSingle(Zoom));
                }
                else
                {
                    object zoom = Zoom;
    
                    var OLECMDEXECOPT_DODEFAULT = 0;
                    var OLECMDID_OPTICAL_ZOOM   = 63;
    
                    FieldInfo   fiComWebBrowser     = null;
                    object      objComWebBrowser    = null;
    
                    if ((fiComWebBrowser    = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic))   != null && 
                        (objComWebBrowser   = fiComWebBrowser.GetValue(wb))                                                                     != null)
                    {
                        objComWebBrowser.GetType().InvokeMember("ExecWB", BindingFlags.InvokeMethod, null, objComWebBrowser, new object[] { OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DODEFAULT, zoom, IntPtr.Zero });
                    }
                }
            }
    

    Das mit dem Löschen des Caches hat bei mir nichts gebracht.

    Nochmals vielen Dank und liebe Grüße

    René


    Dienstag, 9. April 2019 09:20

Alle Antworten

  • Hallo René,

    Ich verlinke hier der Übersichtlichkeit halber Deinen anderen Thread im englischsprachigen MSDN-Forum:
    WPF web browser - Zoom function when displaying PDF, XPS and other file formats

    Der WebBrowser ist ein Wrapper um eine Internet Explorer-Instanz ist und das unterliegende Dokument lässt sich anpassen. Wenn Du die WebBrowser.Navigate-Methode zum Laden der PDF-Datei aufrufst, kannst Du das Zoomen bewirken, indem Du der URL "#zoom=50" oder "#zoom=150" usw. hinzufügst. Ich verweise Dich diesbezüglich auf folgende Threads:
    Zoom WebBrowser page
    Reset PDF Settings and View back to default in IE 11

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 19. März 2019 21:48
    Moderator
  • Hallo René,

    Wie aus Deinem Thread im englischsprachigen Forum ersichtlich ist, hast Du den Ratschlag mit dem Parameter "#zoom=<Zahl>" umgesetzt und beim ersten Laden das Zoomen erfolgreich geändert. Dass das Neuladen des PDF-Dokuments scheitert, wird ebenfalls in folgendem Thread mitgeteilt, wobei in der dortigen Lösung das programmatische Löschen des IE-Caches nahegelegt und zu diesem Zweck von nativen Funktionen Gebrauch gemacht wird :
    WebBrowser control caching issue

    Wenn dies für Dein Anliegen zu umständlich scheint, so schildere ich kurz nachfolgend eine Problemumgehung, die ich gerade ausprobiert habe. Abhilfe schafft das vorläufige Navigieren weg von der PDF-Datei zu einer anderen beliebigen Datei, bevor im Navigated-Ereignis das gewünschte Zoomen bewerkstelligt wird. Zum Laden der Datei wird folgender Code verwendet (wenn es nichts im WebBrowser gab, wird die Datei ohne Angaben zum Zoomen geladen; für diesen Beispielcode kann die Zahl im Voraus in ein Textfeld oder Textblock eingegeben werden):

                int Prozent;
                if (webBrowser1.Document == null)
                    webBrowser1.Navigate("<Ordnerpfad>\\<Deine PDF-Datei>.pdf");
                else if((! String.IsNullOrEmpty(textBox1.Text)) && (int.TryParse(textBox1.Text, out Prozent)))
                {
                    Uri vorläufig = new Uri("<Ordnerpfad>\\VorlaeufigeDatei.txt"); //Die Datei (.htm, .txt ...) muss existieren, kann auch bis auf die Erweiterung mit der PDF-Datei gleichnamig sein.
                    webBrowser1.Navigate(vorläufig);
                }

    Mithilfe des Navigated-Ereignisses kann dann zurück zur PDF-Datei mit der gewünschten Vergrößerung navigiert werden. Das vorläufige Navigieren bleibt unbemerkt.

            private void webBrowser1_Navigated(object sender, NavigationEventArgs e)
            {
                if (e.Uri.ToString().Contains("VorlaeufigeDatei.txt"))
                {
                    string Pfad = e.Uri.ToString().Substring(0, e.Uri.ToString().Length - 3);
                    //Dateierweiterung ersetzen, wenn die vorläufige Datei bis auf die Erweiterung mit der PDF-Datei gleichnamig ist,
                    //ansonsten: string Pfad = "<Ordnerpfad>\\<Deine PDF-Datei>.";
                    Uri gezoomt = new Uri(Pfad + "pdf#zoom=" + textBox1.Text);
                    webBrowser1.Navigate(gezoomt);
                }
            }

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 28. März 2019 14:27
    Moderator
  • Hallo René,

    Hat Dich das programmatische Löschen des IE-Caches oder die Anpassung des Navigated-Ereignisses weitergebracht? Ist der Thread noch aktuell?

    Der Screenshot veranschaulicht das Ergebnis des zweiten Verfahrens (hier .htm als vorläufige Datei statt einer Textdatei):

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 9. April 2019 08:12
    Moderator
  • Danke! Das Problem habe ich gelöst, allerdings schön ist was anderes. Hier die Methode, die das macht:


            public static void SetZoom(this WebBrowser wb, ISEdoc isedoc, string Source, ref int Zoom)
            {
                if (Zoom < 20)
                {
                    Zoom = 20;
                }
                else if (Zoom > 400)
                {
                    Zoom = 400;
                }
    
                if (isedoc.dts.DocumentType(Source) == c.DocType.PDF)
                {
                    var doc = wb.Document as AcroPDFLib.AcroPDF;
                    doc.setZoom(Convert.ToSingle(Zoom));
                }
                else
                {
                    object zoom = Zoom;
    
                    var OLECMDEXECOPT_DODEFAULT = 0;
                    var OLECMDID_OPTICAL_ZOOM   = 63;
    
                    FieldInfo   fiComWebBrowser     = null;
                    object      objComWebBrowser    = null;
    
                    if ((fiComWebBrowser    = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic))   != null && 
                        (objComWebBrowser   = fiComWebBrowser.GetValue(wb))                                                                     != null)
                    {
                        objComWebBrowser.GetType().InvokeMember("ExecWB", BindingFlags.InvokeMethod, null, objComWebBrowser, new object[] { OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DODEFAULT, zoom, IntPtr.Zero });
                    }
                }
            }
    

    Das mit dem Löschen des Caches hat bei mir nichts gebracht.

    Nochmals vielen Dank und liebe Grüße

    René


    Dienstag, 9. April 2019 09:20