You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebView2中Content-Type为application/pdf的响应里PDF在哪?

WebView2中PDF响应的真实内容获取方案

你遇到的问题是Chrome内核(WebView2基于此)的默认行为导致的:当响应的Content-Type为application/pdf时,内核会自动拦截原始PDF数据,替换为内置PDF阅读器的嵌入页面(就是你拿到的带<embed>标签的HTML),真实的PDF二进制数据被内核接管用于渲染,不会通过WebResourceResponseReceived事件直接返回给你的代码。

解决办法

1. 禁用内置PDF阅读器,直接获取原始PDF数据

在WebView2初始化完成后,修改核心设置关闭内置PDF渲染功能,这样内核就不会拦截PDF响应,你就能拿到原始的二进制数据:

// 在WebView2初始化完成的回调中添加
private async void WebView2_InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
    if (e.IsSuccess)
    {
        webView2.CoreWebView2.Settings.IsPdfEnabled = false;
    }
}

之后再通过WebResourceResponseReceived事件获取的流就是真实的PDF二进制数据,你可以直接写入文件:

private async void CoreWebView2_WebResourceResponseReceived(object sender, CoreWebView2WebResourceResponseReceivedEventArgs e)
{
    if (e.Response != null && e.Response.Headers.Contains("Content-Type"))
    {
        if (e.Response.Headers.GetHeader("Content-Type") == "application/pdf")
        {  
            using (var stream = await e.Response.GetContentAsync())
            using (var fileStream = File.Create("saved.pdf"))
            {
                await stream.CopyToAsync(fileStream);
            }
        }
    }
}

2. 通过拦截请求添加下载头,捕获下载事件

如果你需要保留WebView2的PDF预览功能,同时获取PDF文件,可以在WebResourceRequested事件中给PDF响应添加Content-Disposition: attachment头,触发浏览器的下载行为,再通过DownloadStarting事件捕获下载流:

// 注册WebResourceRequested事件(需要在初始化时设置过滤条件)
webView2.CoreWebView2.AddWebResourceRequestedFilter("*", CoreWebView2WebResourceContext.All);
webView2.CoreWebView2.WebResourceRequested += CoreWebView2_WebResourceRequested;

private void CoreWebView2_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e)
{
    var responseHeaders = e.Response.Headers;
    if (responseHeaders.Contains("Content-Type") && responseHeaders.GetHeader("Content-Type") == "application/pdf")
    {
        // 添加下载头,触发下载
        responseHeaders.SetHeader("Content-Disposition", "attachment; filename=\"downloaded.pdf\"");
    }
}

// 注册DownloadStarting事件
webView2.CoreWebView2.DownloadStarting += CoreWebView2_DownloadStarting;

private async void CoreWebView2_DownloadStarting(object sender, CoreWebView2DownloadStartingEventArgs e)
{
    // 取消默认下载弹窗,手动处理文件保存
    e.Cancel = true;
    using (var fileStream = File.Create("downloaded.pdf"))
    {
        await e.DownloadOperation.GetResultAsync().CopyToAsync(fileStream);
    }
}

补充说明

你拿到的那段HTML是Chrome内置PDF阅读器的容器页面,其中的src='about:blank'是占位符,真实的PDF数据由内核内部加载和渲染,不会通过常规的响应流暴露,所以必须通过上述两种方法绕开内核的自动处理才能获取到原始PDF文件。

内容的提问来源于stack exchange,提问作者darbid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:20:51