0

我试图让我的 web 应用程序通过另存为对话框下载 PDF 文件。但是,在尝试之后,当我使用 chrome/firefox 时,并没有出现任何另存为对话框。但是当我使用 IE 时,我得到了这个错误

在此处输入图像描述

会不会是浏览器之间的一些错误?我已将我的 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();
    }




}

如果有人能告诉我我是否在这里做错了什么,将不胜感激。

4

2 回答 2

0

我相信问题出在您的 ContentType 上。如果您将其更改为“application/octet-stream”,那应该可以解决您的问题。

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

您也可以尝试添加:

Response.Flush()
Response.Close()

之前Response.End()。在结束响应之前,可能并非所有缓冲的数据都已传输到客户端。

如果这不起作用,您应该验证您确实有数据要发送到bytes数组中。

于 2013-07-11T02:37:12.697 回答
-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();
于 2013-07-11T05:25:14.113 回答