【问题标题】:how can i open pdf generated by report viewer in new tab?如何在新选项卡中打开报告查看器生成的 pdf?
【发布时间】:2013-10-01 12:19:00
【问题描述】:

我编写了一个代码来创建 PDF 并下载它

 protected void create_pdf_Click(object sender, EventArgs e)
{
    Warning[] warnings;
    string[] streamIds;
    string mimeType = string.Empty;
    string encoding = string.Empty;
    string extension = string.Empty;
    string devinfo = "<DeviceInfo><ColorDepth>32</ColorDepth><DpiX>350</DpiX><DpiY>350</DpiY><OutputFormat>PDF</OutputFormat>" +
           "  <PageWidth>8.5in</PageWidth>" +
            "  <PageHeight>11in</PageHeight>" +
            "  <MarginTop>0.5in</MarginTop>" +
            "  <MarginLeft>0.5in</MarginLeft>" +
             "  <MarginRight>0in</MarginRight>" +
             "  <MarginBottom>0in</MarginBottom>" +
           "</DeviceInfo>";

    // Setup the report viewer object and get the array of bytes
    ReportViewer viewer = new ReportViewer();
    viewer.ProcessingMode = ProcessingMode.Local;
    viewer.LocalReport.ReportPath = Server.MapPath("~/Installments_Report.rdlc");
    DataView dv = new DataView();
    DataTable dt = new DataTable();
    dv = (System.Data.DataView)SqlDataSource1.Select(System.Web.UI.DataSourceSelectArguments.Empty);
    dt = dv.ToTable();
    viewer.LocalReport.DataSources.Add(new ReportDataSource("DataSet1", dt));

    byte[] bytes = viewer.LocalReport.Render("PDF", devinfo, out mimeType, out encoding, out extension, out streamIds, out warnings);


    // Now that you have all the bytes representing the PDF report, buffer it and send it to the client.
    Response.Buffer = true;
    Response.Clear();
    Response.ContentType = mimeType;
    Response.AddHeader("content-disposition", "attachment; filename=" + "Installments" + "List" + "." + extension);
    Response.BinaryWrite(bytes); // create the file
    Response.Flush(); // send it to the client to download
}

有什么方法可以在新标签页或新页面中打开此 PDF 吗?

那是因为我需要有按钮来直接打印报告

建议在新的水龙头中打开 pdf 然后用户可以打印它

还有什么建议!!?

感谢您的帮助!*

【问题讨论】:

  • 使用带有 target="_blank" 的 html 锚点重定向到新页面并在新页面的 Page_Load 中生成报告?
  • 好的,但是这个下载代码不能打开创建的 pdf @PeetvdWesthuizen
  • @PeetvdWesthuizen 我需要在浏览器窗口中查看 pdf
  • 强制打开 pdf 将 Content-Disposition Header 表单附件更改为 inline : Content-Type: application/pdf Content-Disposition: inline;文件名.pdf
  • 您可以将 byte[] 保存在会话中并在新页面上使用它吗?

标签: c# asp.net pdf reportviewer


【解决方案1】:

我有答案了

  1. 首先您需要从报表查看器创建 pdf 文件并保存 服务器上的某处
  2. 您需要以唯一的名称保存文件
  3. 之后使用文件流将字节写入服务器路径上的 pdf 文件
  4. 使用查询字符串将文件名路径到新页面
  5. 在 Page_Load 中从查询字符串中获取 pdf 文件名并打开它

    protected void Print_Click(object sender, EventArgs e)
    {
    Warning[] warnings;
    string[] streamIds;
    string mimeType = string.Empty;
    string encoding = string.Empty;
    string extension = string.Empty;
    string devinfo = "<DeviceInfo><ColorDepth>32</ColorDepth><DpiX>350</DpiX><DpiY>350</DpiY><OutputFormat>PDF</OutputFormat>" +
           "  <PageWidth>8.5in</PageWidth>" +
            "  <PageHeight>11in</PageHeight>" +
            "  <MarginTop>0.5in</MarginTop>" +
            "  <MarginLeft>0.5in</MarginLeft>" +
             "  <MarginRight>0in</MarginRight>" +
             "  <MarginBottom>0in</MarginBottom>" +
           "</DeviceInfo>";
    
    // Setup the report viewer object and get the array of bytes
    ReportViewer viewer = new ReportViewer();
    viewer.ProcessingMode = ProcessingMode.Local;
    viewer.LocalReport.ReportPath = Server.MapPath("~/Installments_Report.rdlc");
    DataView dv = new DataView();
    DataTable dt = new DataTable();
    dv = (System.Data.DataView)SqlDataSource1.Select(System.Web.UI.DataSourceSelectArguments.Empty);
    dt = dv.ToTable();
    viewer.LocalReport.DataSources.Add(new ReportDataSource("DataSet1", dt));
    
    byte[] bytes = viewer.LocalReport.Render("PDF", devinfo, out mimeType, out encoding, out extension, out streamIds, out warnings);
    // Now that you have all the bytes representing the PDF report, buffer it and send it to the client.
    string path =Server.MapPath("Print_Files") ;
    Random rnd = new Random();
    int month = rnd.Next(1, 13); // creates a number between 1 and 12
    int dice = rnd.Next(1, 7); // creates a number between 1 and 6
    int card = rnd.Next(9); // creates a number between 0 and 51
    string file_name = "Installments" + "List" + month+dice+card+".pdf"; //save the file in unique name 
    
    //3. After that use file stream to write from bytes to pdf file on your server path
    
    FileStream file = new FileStream(path + "/" + file_name, FileMode.OpenOrCreate, FileAccess.ReadWrite);
    file.Write(bytes, 0, bytes.Length);
    file.Dispose();
    
    //4.path the file name by using query string to new page 
    
    Response.Write(string.Format("<script>window.open('{0}','_blank');</script>", "Print.aspx?file="+file_name));
     }
    

在 Page_Load 中从查询字符串中获取 pdf 文件名并在 Web 浏览器中打开 PDF 文件

    protected void Page_Load(object sender, EventArgs e)
      {
    string file_name = Request.QueryString["file"];
    string path = Server.MapPath("Print_Files/"+file_name);

    // Open PDF File in Web Browser 

    WebClient client = new WebClient();
    Byte[] buffer = client.DownloadData(path);
    if (buffer != null)
    {
        Response.ContentType = "application/pdf";
        Response.AddHeader("content-length", buffer.Length.ToString());
        Response.BinaryWrite(buffer);
    }
 }

完成!!! 希望这段代码对某人有帮助:) 谢谢!!!

【讨论】:

  • 感谢@PeetvdWesthuizen ;)
  • 它工作正常,直到我没有添加子报告。任何人都知道如何在相同的情况下处理子报告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 2016-09-24
  • 2021-12-26
  • 2019-10-18
相关资源
最近更新 更多