如何在C# WinForm .NET 6项目的WebView2中获取PDF当前页码?
获取WebView2中PDF当前页码的解决办法
核心思路是通过WebView2注入JavaScript脚本,调用Chrome内置PDF阅读器的window.PDFViewerApplication对象来获取和监听页码:
单次获取当前页码
在WebView2完成初始化后,执行以下C#代码:private async void GetCurrentPdfPage() { if (webView21.CoreWebView2 == null) return; string getPageScript = @" typeof window.PDFViewerApplication !== 'undefined' ? window.PDFViewerApplication.page : -1; "; string result = await webView21.CoreWebView2.ExecuteScriptAsync(getPageScript); if (int.TryParse(result.Trim('"'), out int currentPage) && currentPage != -1) { // 这里处理获取到的页码,比如更新UI // 注意跨线程更新UI需要Invoke labelPageNumber.Invoke(() => labelPageNumber.Text = $"当前页码:{currentPage}"); } }实时监听页码变化
如果需要实时获取页码更新,可在WebView2初始化完成后注入监听脚本,并通过WebMessageReceived事件接收页码:private void WebView21_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e) { if (!e.IsSuccess) return; // 注入监听页码变更的脚本 string listenScript = @" if (typeof window.PDFViewerApplication !== 'undefined') { window.PDFViewerApplication.eventBus.on('pagechange', () => { window.chrome.webview.postMessage(window.PDFViewerApplication.page); }); } "; _ = webView21.CoreWebView2.ExecuteScriptAsync(listenScript); // 注册消息接收事件 webView21.CoreWebView2.WebMessageReceived += CoreWebView2_WebMessageReceived; } private void CoreWebView2_WebMessageReceived(object sender, CoreWebView2WebMessageReceivedEventArgs e) { if (int.TryParse(e.WebMessageAsJson.Trim('"'), out int currentPage)) { labelPageNumber.Invoke(() => labelPageNumber.Text = $"当前页码:{currentPage}"); } }
注意事项
- 该方案依赖Chrome内置的PDF阅读器,若WebView2使用第三方PDF渲染组件,此方法不适用
- 执行脚本前需确保当前加载的是PDF文件,可通过判断URL后缀或检查页面是否存在
PDFViewerApplication对象验证 - 异步操作更新UI时必须使用
Invoke切换到UI线程,避免跨线程异常
内容的提问来源于stack exchange,提问作者Louis Fequet
相关产品推荐
相关产品推荐

