Asp.Net中用Javascript下载打开PDF时新标签页窗口高度过小求助
Asp.Net应用PDF新标签页打开窗口高度过小的解决思路
我开发了一款Asp.Net应用,可实现浏览器从服务器下载PDF文件并在新标签页中打开,功能层面运行正常,但打开的PDF窗口高度过小。以下是相关代码,求解决思路:
相关代码
Asp.Net Controller
[HttpPost] public IActionResult DownloadPdf(){ var stream = new FileStream( pdfPath, FileMode.Open ); return ControllerBase.File( stream, "application/pdf", pdfName); }
Asp.Net _Layout.cshtml
<head> <link rel="stylesheet" href="~/css/common.css" /> .........another codes...... </head> <body> <main>@RenderBody()</main> </body>
Asp.Net DownloadPdf.cshtml
<button id="download">Download</button>
Javascript
$("#downloadPdf").click(function(){ let response = await fetch( DownloadPdf",{ method: "POST", } let blob = await response.blob(); let url = (window.URL || window.webkitURL).createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.target = "_blank"; a.rel = "noopener noreferrer"; a.id = 1; document.body.appendChild(a); a.click(); document.body.removeChild(a); }
效果展示

解决思路
1. 改用window.open自定义窗口尺寸
替换<a>标签点击的方式,直接用window.open打开Blob URL并指定窗口宽高,能精确控制新窗口的大小:
$("#download").click(async function(){ // 修正选择器与按钮id不匹配的问题 let response = await fetch("DownloadPdf", { method: "POST", }); let blob = await response.blob(); let url = (window.URL || window.webkitURL).createObjectURL(blob); // 设置窗口为屏幕的90%宽高,居中显示 const width = Math.floor(window.innerWidth * 0.9); const height = Math.floor(window.innerHeight * 0.9); const left = Math.floor((window.innerWidth - width) / 2); const top = Math.floor((window.innerHeight - height) / 2); // 打开窗口并指定参数 window.open(url, "_blank", `width=${width},height=${height},left=${left},top=${top},scrollbars=yes,toolbar=no`); // 延迟释放Blob URL,避免窗口加载失败 setTimeout(() => { (window.URL || window.webkitURL).revokeObjectURL(url); }, 2000); });
2. 调整浏览器PDF预览默认设置
部分浏览器的内置PDF查看器会使用固定的默认窗口尺寸,可引导用户调整:
- 打开浏览器设置,搜索“PDF查看器”相关选项
- 将默认视图设置为“适合页面”或“适合宽度”,部分浏览器还支持设置默认窗口大小
3. 修改Controller响应逻辑,让浏览器直接打开PDF
在返回文件时去掉文件名参数,浏览器会直接用内置预览器打开PDF,而非触发下载流程,此时窗口会默认使用全屏或合适的尺寸:
[HttpPost] public IActionResult DownloadPdf(){ var stream = new FileStream(pdfPath, FileMode.Open); // 不指定文件名,浏览器直接打开PDF return File(stream, "application/pdf"); }
内容的提问来源于stack exchange,提问作者Lemonade
相关产品推荐
相关产品推荐

