Веб-браузер WPF - функция масштабирования при отображении PDF с помощью элемента управления Acrobat - PullRequest
0 голосов
/ 20 марта 2019

Я покажу контент в двух отдельных окнах веб-браузера в приложении WPF. Как правило, это содержимое в формате PDF или XPS, представленное программой Adobe Control или средством просмотра XPS. Файлы изображений (например, JPG, PNG и т. Д.), А также содержимое HTML отображаются в веб-браузере в исходном формате.

Все работает хорошо, но я не могу настроить отображаемое содержимое по ширине или высоте окна при отображении файла PDF в элементе управления Acrobat. Я могу настроить содержимое до желаемого размера (масштабирование) с помощью мыши ( Ctrl + колесо мыши) или с помощью клавиатуры ( Ctrl + 0 / Ctrl + 1 ), но как мне это сделать в программном коде?

Я пробовал это с ExecWB: он работает для других форматов (htmp, jpg, png, xps и т. Д.), Но он падает, когда файл PDF отображается в элементе управления Acrobat. Вот мой код:

public static partial class WebBrowserExtensions
{
    public static int Zoom = 100;

    public static void SetZoom(this WebBrowser wb, int _Zoom, string DocumentType, string Source)
    {
        if ((Zoom += _Zoom) < 20)
        {
            Zoom = 20;
        }
        else if (Zoom > 400)
        {
            Zoom = 400;
        }

        if (DocumentType == "PDF")
        {
            wb.Source = new Uri("about:blank");
            wb.Source = new Uri($"{Source}#zoom={Zoom}");
            wb.Refresh();
        }
        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 });
            }
        }
    }
}

Теперь я пытаюсь в «ветке PDF» с параметром «# zoom = factor» перезагрузить файл PDF, но веб-браузер тогда показывает только серое окно. Но если я сделаю этот параметр при первой загрузке файла PDF, он будет работать.

Если бы я мог перезагрузить и отобразить PDF-файл с параметром "# zoom = factor", я бы закончил, даже если это не очень хорошее решение.

Я тоже пробовал mshtml.IHTMLDocument2:

public static class Extensionmethod
{
    public static void SetZoom(this System.Windows.Controls.WebBrowser WebBrowser1, double Zoom)
    {
        // For this code to work: add the Microsoft.mshtml .NET reference      
        mshtml.IHTMLDocument2 doc = WebBrowser1.Document as mshtml.IHTMLDocument2;
        doc.parentWindow.execScript("document.body.style.zoom=" + Zoom.ToString().Replace(",", ".") + ";");
    }
}

Результат не очень хороший: страница увеличена, а не содержимое. Это также означает, что при уменьшении части, которые ранее были вне видимой области, по-прежнему не отображаются, а отображаются только в белой области.

Как настроить элемент управления Acrobat для правильного увеличения содержимого в элементе управления веб-браузера?

...