2013-07-11 55 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();