c# - WPF Web 浏览器 - 使用 Acrobat 控件显示 PDF 时的缩放功能
问题描述
我将在 WPF 应用程序的两个单独的 Web 浏览器窗口中显示内容。通常,此内容是由 Adobe 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# - 时间:2018-05-10 标签:c#experiencedchange of value - 当心调试器
- animation - 基于过渡的Vue swiper
- linux - Valid shell script input date format
- javascript - 1 状态属性的更改触发整个元素和所有子元素的重新渲染
- sql - 我想从 BigQuery 表中获取至少具有两个所需值之一的记录
- fullcalendar - jquery全日历自定义滚动条
- python - 如何跳过python列表中的错误链接
- java - 将数据与 OneToMany 关系合并
- python - Django对子查询进行注释
- reactjs - 反应框架和支持框架有什么区别