Search code examples
c#asp.netpdfreportviewer

how can i open pdf generated by report viewer in new tab?


I did a code to create PDF and download it

 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
}

Have any ways to open this PDF in a new tab or page ?

that's because i need to have button to direct print the report

the suggestion that to open the pdf in new tap then user can print it

any other suggestion !!?

Thanks for the help!*


Solution

  • i have got answer

    1. Firstly You Need To create pdf file from report viewer and Save it somewhere on server
    2. you need to save the file in unique name
    3. After that use file stream to write from bytes to pdf file on your server path
    4. path the file name by using query string to new page
    5. in Page_Load qet the pdf file name from query string and open it

      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));
       }
      

    in Page_Load qet the pdf file name from query string and Open PDF File in Web Browser

        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);
        }
     }
    

    Done !!! hope this code helpful to someone :) Thanks!!!