pdf - 查看pdf时隐藏或修改Webview2的工具栏

标签 pdf webview2

我正在使用新的 Webview2 控件在我的 WPF 应用程序中呈现 Pdf 文件。
这运行良好,但我想自定义工具栏以隐藏例如某些条件下的保存按钮。我没有找到直接从 Webview2/CoreWebView2 对象执行此操作的方法或属性。
但是,如果我检查呈现 pdf 时生成的网页代码,我可以看到保存按钮所在的部分
enter image description here
是否可以在呈现之前拦截整个页面并更改 html ?我知道这样做很脏,因为它需要查找可能会更改的类 Id,但它现在可以作为临时解决方案使用。

最佳答案

是的,将脚本添加到您的环境中是 100% 可能的,它可以拦截和控制您正在渲染的内容。
我在 windows 窗体中使用 WebView2,因此我将向您展示我如何在桌面 windows 窗体应用程序中执行此操作,其他环境的过程类似,WPF 项目的过程几乎相同。
第1步
设置和初始化 webview2 控件的默认设置

public FrmMainForm()
{
  InitializeComponent();

  // Resize/position client to a standard 720p HD TV and make room for tools
  var toolBarSize =
    PnlToolPanelTopRow.Height +
    PnlToolPanelLowerRow.Height;

  SetClientSizeCore(1280, toolBarSize + 720);
  //webview.Top = toolBarSize;
  webview.Height = 720;

  // Webview initialisation handler, called when control instatiated and ready
  webview.CoreWebView2InitializationCompleted += Webview_CoreWebView2InitializationCompleted;

  // Set defaults for tools
  TxtAppUrl.Text = "http://app/";
  TxtUserAgent.Text = DEFAULTUA;
}
注意“初始化处理程序”附加到初始化完成事件。
第2步
在您的初始化事件处理程序中,您需要在每次初始化浏览器 View 时加载您希望运行的 JavaScript。这些脚本总是在加载页面中的任何脚本之前执行,或者在 dom 加载之前,它们在页面导航之后执行,因此您不能使用它们来控制导航周期。
这是一个例子,来自我的一个项目
private void Webview_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
  // Custom URL handler (All URLS starting "http://app/" are intercepted directly by the application
  webview.CoreWebView2.AddWebResourceRequestedFilter("http://app/*", CoreWebView2WebResourceContext.All);
  webview.CoreWebView2.WebResourceRequested += WebResourceRequested;

  // Load in our custom JS API files to create the HbbTv JS environment
  webview.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(JsLoader.LoadApi("BrowserOverrides.js"));

  // Assign any back end C sharp classes to support our JS api's
  webview.CoreWebView2.AddHostObjectToScript("channelData", new ChannelData());

  // Event handler for notification of dom content load finished
  //webview.CoreWebView2.DOMContentLoaded += CoreWebView2_DOMContentLoaded;

  // Show dev tools by default
  webview.CoreWebView2.OpenDevToolsWindow();

  // Other misc settings
  webview.CoreWebView2.Settings.UserAgent = DEFAULTUA;

}
您还需要注意的那一行是:
webview.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(JsLoader.LoadApi("BrowserOverrides.js"));
我使用自定义加载程序类,它从编译到我的应用程序的资源中获取我的 java 脚本文件,但是您不需要,传递给 AddScript 调用的唯一参数只是一个普通的 java 脚本代码字符串,例如:
webview.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync("alert('hello world');");
将导致您的 webview2 session 在每次导航之后,但在页面中的 dom 和脚本加载和运行之前,对于在 webview 中浏览到的每个页面显示警报。
JS 代码可以完全访问浏览器环境,因此只需将常规 JS 处理程序附加到“dom加载”或“页面加载”常规 java 脚本事件之一,然后使用标准 dom 操作来查找元素想要并将其显示样式设置为“无”。
第 3 步(可选)
您还将从我的第二个代码片段中看到,您可以使用另外 2 个 Hook 点。
webview.CoreWebView2.AddHostObjectToScript("channelData", new ChannelData());
将我的自定义 C# 类类型“ChannelData”添加到浏览器环境,然后通过以下 JS 代码将其提供给浏览器
chrome.webview.hostObjects.channelData.(method name or property name accessible here)
在“hostObjects”之后的“channelData”名称与“AddHostObject”调用的第一个参数中使用的相同,第二个消息是一个常规的 C# 类,必须如下设置:
using HbbTvBrowser.DataClasses;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;

namespace JsSupportClasses
{
  [ClassInterface(ClassInterfaceType.AutoDual)]
  [ComVisible(true)]
  public class (Class Name Here)
  {
    public string SomeMethod()
    {
      return JsonConvert.SerializeObject(Some C# objects to return);
    }
  }
}
如果未提供类接口(interface)和 com 可见属性,则 Web View 将看不到该类,并且该类将不可调用。
任何由你的方法返回给 JS 代码的数据,必须是一个简单的数据类型,比如 int、bool 或 string,这意味着你不能在没有首先序列化它们的情况下返回复杂的对象,然后在你回到 JS 土地后反序列化它们。
您会注意到还有一个 C# 级别的 dom 就绪处理程序。一旦加载了 HTML 并准备好访问,就会触发它,但在加载图像、脚本、css 或其他类似的东西之前。但是,您不能从 C# 更改 dom 内容,至少目前不能,我确实相信它可能会在今年某个时候出现在团队的视线中,但我无法确认这一点。
虽然我自己不需要这样做,但我确实相信可以在 C# 中获得加载的 HTML 的副本,但这只是“副本”,更改它不会更改实际加载的 dom。

关于pdf - 查看pdf时隐藏或修改Webview2的工具栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66209815/

相关文章:

c# - 在 WPF 中打开 WebView2 会在调用 EnsureCoreWebView2Async 时导致 System.UnauthorizedAccessException

javascript - 带有 JavaScript 文件的 HTML 无法在 WPF 应用程序内的 WebView2 上运行

.net-core - 绕过 WebView2 中显示的 Kestrel 服务器的无效 SSL 证书

Java Swing - PDF 缩略图查看器

pdf - 如何确定 pdf 文档中单词的字体系列和字体大小?

c# - e.NewWindow = (CoreWebView2)sender 仍然会产生单独的实例

c# - 为什么作为 webView2 对象的 coreWebView2 为空?

javascript - 使用html5从safari浏览器将blob插入sqlite

ios - 将 WebView 中传入的 PDF 保存到内存

excel - 在 VBA 中将文本 PDF 转换为 Excel