首页 > 解决方案 > WPF Web 浏览器 - 使用 Acrobat 控件显示 PDF 时的缩放功能

问题描述

我将在 WPF 应用程序的两个单独的 Web 浏览器窗口中显示内容。通常,此内容是由 Adob​​e Control 或 XPS 查看器表示的 PDF 或 XPS 文件。图像文件(例如 JPG、PNG 等)以及 HTML 内容在 Web 浏览器中本地显示。

一切正常,但是当我在 Acrobat 控件中显示 PDF 文件时,我无法将显示的内容调整为窗口宽度或高度。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 文件,但 Web 浏览器只显示一个灰色窗口。但是,如果我在第一次加载 PDF 文件时执行此参数,它就可以工作。

如果我可以使用“#zoom=factor”参数重新加载和渲染 PDF 文件,我就完成了,即使这不是一个好的解决方案。

我也试过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 控件正确放大 Web 浏览器控件中的内容?

标签: c#wpfpdfacrobat

解决方案


推荐阅读