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

如何在C# ASP.NET中实现PDF在新标签页打开

解决PDF在新标签页打开的问题

你当前的代码存在两个核心问题,导致无法在新标签页打开PDF:

  • 直接把二进制数组FileBuffer拼到window.open里完全错误,window.open需要的是可访问的URL地址,不是原始二进制数据,这种拼接方式生成的字符串根本不是有效链接,浏览器无法正确解析。
  • 后台同时执行了Response.BinaryWrite(FileBuffer),这会直接把PDF内容输出到当前页面的响应流中,相当于把当前页面直接替换成了PDF,前端的window.open脚本要么没机会执行,要么执行后也被当前响应覆盖。

下面给你两种可行的解决方案:

方案一:将PDF放到网站可访问目录(最简单)

如果PDF文件可以放到网站的公开目录下(比如项目根目录的Pdfs文件夹),直接生成文件的访问URL,用window.open打开新标签页即可:

protected void bttnpdf_Click(object sender, EventArgs e)
{
    string fileName = "testPdf1.pdf";
    // 假设PDF放在网站根目录的Pdfs文件夹下
    string pdfUrl = "/Pdfs/" + fileName;
    // 注册脚本打开新标签页
    ScriptManager.RegisterStartupScript(Page, typeof(Page), "OpenPdf", $"window.open('{pdfUrl}', '_blank');", true);
}

方案二:用一般处理程序(ASHX)输出PDF(适合PDF不在网站目录的情况)

如果PDF必须存放在服务器本地非网站目录(比如c:\TestCode\TestPdfs\),可以创建一个ASHX处理程序来读取并输出PDF,再让前端打开这个处理程序的URL:

1. 创建ASHX文件(命名为PdfHandler.ashx)

public class PdfHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        string fileName = context.Request.QueryString["fileName"];
        if (string.IsNullOrEmpty(fileName))
        {
            context.Response.StatusCode = 400;
            return;
        }
        string path = @"c:\TestCode\TestPdfs\" + fileName;
        if (!File.Exists(path))
        {
            context.Response.StatusCode = 404;
            return;
        }
        // 输出PDF内容
        context.Response.ContentType = "application/pdf";
        context.Response.AddHeader("Content-Disposition", $"inline; filename={fileName}");
        context.Response.TransmitFile(path);
    }

    public bool IsReusable => false;
}

2. 修改按钮点击事件代码

protected void bttnpdf_Click(object sender, EventArgs e)
{
    string fileName = "testPdf1.pdf";
    // 拼接ASHX的访问URL,带上文件名参数
    string handlerUrl = $"/PdfHandler.ashx?fileName={HttpUtility.UrlEncode(fileName)}";
    // 注册脚本打开新标签页
    ScriptManager.RegisterStartupScript(Page, typeof(Page), "OpenPdf", $"window.open('{handlerUrl}', '_blank');", true);
}

核心逻辑是让window.open指向一个能返回PDF内容的有效URL,同时不要在当前页面的响应中输出PDF,避免干扰前端脚本执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:02:18