2013-07-11 57 views
0

我試圖讓我的web應用程序下載帶有另存爲對話框的PDF文件。但是,嘗試之後,沒有任何保存,因爲當我使用chrome/firefox時出現對話框。但是當我使用IE瀏覽器,我得到這個錯誤下載PDF文件時另存爲對話框

enter image description here

難道是瀏覽器之間的一些錯誤?我已經將我的PDF文件保存/轉換爲字節。

protected void btnPDF_Click(object sender, EventArgs e) 
    { 
     //Byte array that will eventually hold our PDF, currently empty 
     Byte[] bytes; 

     //Instead of a FileStream we'll use a MemoryStream 
     using (var MS = new System.IO.MemoryStream()) 
     { 

      //Standard PDF setup, iText doesn't care what type of stream we're using 
      var doc = new iTextSharp.text.Document(); 
      var writer = iTextSharp.text.pdf.PdfWriter.GetInstance(doc, MS); 
      doc.Open(); 
      PdfPTable table = new PdfPTable(1); 
      table.TotalWidth = 585f; 
      table.LockedWidth = true; 

      var logo = iTextSharp.text.Image.GetInstance(Server.MapPath("~/image/logo.jpg")); 
      doc.Add(logo); 

      var titleFont = FontFactory.GetFont("Arial", 18, Font.BOLD); 
      doc.Add(new Paragraph("Officer's Profile. Officer's Police ID: " + DDLCase.SelectedValue, titleFont)); 

      var normalFont = FontFactory.GetFont(FontFactory.HELVETICA, 14, Font.BOLD); 
      var phrase = new Phrase(); 

      SqlConnection con = new SqlConnection("Data Source = localhost; Initial Catalog = project; Integrated Security = SSPI"); 

      SqlCommand cm = new SqlCommand("Select lrp.fullname, pp.profilepic, pp.rank, lrp.policeid, lrp.nric, lrp.email, lrp.contact, lrp.address,lrp.location, pp.achievement, pp.medal1, pp.medal2, pp.medal3, pp.medal4, pp.medal5 from LoginRegisterPolice lrp, PoliceProfile pp where lrp.policeid = '" + DDLCase.SelectedValue + "' and pp.policeid = lrp.policeid", con); 
      con.Open(); 
      SqlDataReader dr; 

      dr = cm.ExecuteReader(); 

      if (dr.Read()) 
      { 
       phrase.Add(new Chunk("Full Name :", normalFont)); 
       phrase.Add(dr[0].ToString()); 

       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 


       phrase.Add(new Chunk("Profile Picture :\u00a0", normalFont)); 
       Byte[] bytes1 = (Byte[])dr[1]; 
       iTextSharp.text.Image image1 = iTextSharp.text.Image.GetInstance(bytes1); 
       image1.ScaleToFit(100f, 250f); 
       Chunk imageChunk1 = new Chunk(image1, 0, 0); 
       phrase.Add(imageChunk1); 

       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 

       phrase.Add(new Chunk("Rank : ", normalFont)); 
       Byte[] bytes2 = (Byte[])dr[2]; 
       iTextSharp.text.Image image2 = iTextSharp.text.Image.GetInstance(bytes2); 
       image2.ScaleToFit(40f, 300f); 
       Chunk imageChunk2 = new Chunk(image2, 0, 0); 
       phrase.Add(imageChunk2); 

       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 

       phrase.Add(new Chunk("Police ID :", normalFont)); 
       phrase.Add(dr[3].ToString()); 

       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 

       phrase.Add(new Chunk("NRIC :", normalFont)); 
       phrase.Add(dr[4].ToString()); 

       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 

       phrase.Add(new Chunk("Email :", normalFont)); 
       phrase.Add(dr[5].ToString()); 

       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 

       phrase.Add(new Chunk("Contact :", normalFont)); 
       phrase.Add(dr[6].ToString()); 

       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 

       phrase.Add(new Chunk("Address :", normalFont)); 
       phrase.Add(dr[7].ToString()); 

       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 

       phrase.Add(new Chunk("Location :", normalFont)); 
       phrase.Add(dr[8].ToString()); 

       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 

       phrase.Add(new Chunk("Achievement :", normalFont)); 
       phrase.Add(dr[9].ToString()); 

       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 
       phrase.Add(Chunk.NEWLINE); 



       phrase.Add(new Chunk("Medal1", normalFont)); 
       Byte[] bytes3 = (Byte[])dr[10]; 
       iTextSharp.text.Image image3 = iTextSharp.text.Image.GetInstance(bytes3); 
       image3.ScaleToFit(800f, 800f); 
       Chunk imageChunk3 = new Chunk(image3, 0, 0); 
       phrase.Add(imageChunk3); 


       phrase.Add(new Chunk("Medal2", normalFont)); 
       Byte[] bytes5 = (Byte[])dr[11]; 
       iTextSharp.text.Image image5 = iTextSharp.text.Image.GetInstance(bytes5); 
       image5.ScaleToFit(800f, 800f); 
       Chunk imageChunk5 = new Chunk(image5, 0, 0); 
       phrase.Add(imageChunk5); 



       phrase.Add(new Chunk("Medal3", normalFont)); 
       Byte[] bytes6 = (Byte[])dr[12]; 
       iTextSharp.text.Image image6 = iTextSharp.text.Image.GetInstance(bytes6); 
       image6.ScaleToFit(800f, 800f); 
       Chunk imageChunk6 = new Chunk(image6, 0, 0); 
       phrase.Add(imageChunk6); 

       phrase.Add(new Chunk("Medal4", normalFont)); 
       Byte[] bytes7 = (Byte[])dr[13]; 
       iTextSharp.text.Image image7 = iTextSharp.text.Image.GetInstance(bytes7); 
       image7.ScaleToFit(800f, 800f); 
       Chunk imageChunk7 = new Chunk(image7, 0, 0); 
       phrase.Add(imageChunk7); 

       phrase.Add(new Chunk("Medal5", normalFont)); 
       Byte[] bytes8 = (Byte[])dr[14]; 
       iTextSharp.text.Image image8 = iTextSharp.text.Image.GetInstance(bytes8); 
       image8.ScaleToFit(800f, 800f); 
       Chunk imageChunk8 = new Chunk(image8, 0, 0); 
       phrase.Add(imageChunk8); 

       table.AddCell(phrase); 


      } 

      dr.Close(); 
      doc.Add(table); 
      doc.Close(); 

      //Grab the raw bytes from the MemoryStream 
      bytes = MS.ToArray(); 
     } 



     //At this point all iText work is done and we're only dealing with raw ASP.Net parts 

     //Clear the current response buffer 
     Response.Clear(); 
     //Instead of a normal text/html header tell the browser that we've got a PDF 
     Response.ContentType = "application/pdf"; 
     //Tell the browser that you want the file downloaded (ideally) and give it a pretty filename 
     Response.AddHeader("content-disposition", "attachment;filename=MySampleFile.pdf"); 
     //Write our bytes to the stream 
     Response.BinaryWrite(bytes); 
     //Close the stream (otherwise ASP.Net might continue to write stuff on our behalf) 
     Response.End(); 
    } 




} 

希望如果有人能告訴我,如果我在這裏做了任何錯誤。

+0

你能在多臺PC上重現此問題?有問題的對話框看起來像一個本地代碼擴展(例如您的PDF閱讀器軟件)崩潰。 – EricLaw

+0

當我在線測試webapp時,當我單擊Chrome和IE中的PDF按鈕時,什麼都沒有發生。只有當我在IE中的本地主機上運行它時纔會出現錯誤。 –

回答

0

我認爲問題出在您的ContentType上。如果將其更改爲「application/octet-stream」,則應解決您的問題。

Response.ContentType = "application/octet-stream"; 

您也可以嘗試添加:

Response.Flush() 
Response.Close() 
Response.End()

。在結束響應之前,可能並非所有緩衝數據都已傳輸到客戶端。

如果這不起作用,您應該確認您實際上有數據要發送到bytes陣列中。

+0

添加八位字節流後,當我在IE上運行時,錯誤仍然存​​在於本地主機上。 –

+0

@TeoChuenWeiBryan:更新了答案,並嘗試了其他的東西。 –

-1

利用這一點,

string fileName = string.Format(Guid.NewGuid()+".pdf"); 
htmlToPdf(Server.MapPath(@"~\temp\") + fileName); 
Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName); 
Response.ContentType = "application/pdf"; 
Response.TransmitFile(filePath); 
Response.End();