通过iTextSharp ASP.NET将二进制图像数据从SQL Server检索为pdf

我正在尝试从我的SQL服务器检索二进制图像数据,并使用follow方法将其导出到我的pdf文件中

phrase.Add(new Chunk("Image :", normalFont)); Byte[] bytes = (Byte[])dr[0]; Response.Buffer = true; Response.Charset = ""; Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.ContentType = "image/jpg"; Response.BinaryWrite(bytes); Response.Flush(); Response.End(); phrase.Add(bytes); table.AddCell(phrase); 

当我尝试使用上述方法将二进制图像数据显示到我的webapp中时,它可以正常工作。 不幸的是,当我想将图像导出到我的pdf文件时,它不起作用。

我在phrase.Add方法上有这样的错误。 我知道我做错了什么但我无法弄明白

在此处输入图像描述

这是我的PDF按钮的整个后端代码。

 protected void btnPDF_Click(object sender, EventArgs e) { var doc1 = new Document(); var filename = "MyTestPDF" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".pdf"; var output = new FileStream(Path.Combine("C:\\Users\\apr12mpsip\\Desktop\\New folder", filename), FileMode.Create); PdfWriter.GetInstance(doc1, output); PdfPCell cell = null; doc1.Open(); PdfPTable table = new PdfPTable(1); table.TotalWidth = 585f; table.LockedWidth = true; var logo = iTextSharp.text.Image.GetInstance(Server.MapPath("~/image/logo.jpg")); doc1.Add(logo); var titleFont = FontFactory.GetFont("Arial", 18, Font.BOLD); doc1.Add(new Paragraph("Official Report. Member Report 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 lro.fullname, lro.contact, mr.typeofcrime, mr.location,mr.crdatetime, pr.policeid, pr.prdatetime, mr.citizenreport, pr.policereport, aor.officialreport, mr.image1 from MemberReport mr, PoliceReport pr, LoginRegisterOthers lro, AdminOfficialReport aor where mr.memberreportid = '" + DDLCase.SelectedValue + "' and mr.memberreportid=pr.memberreportid and pr.policereportid=aor.policereportid", 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(new Chunk("Contact :", normalFont)); phrase.Add(dr[1].ToString()); phrase.Add(Chunk.NEWLINE); phrase.Add(Chunk.NEWLINE); phrase.Add(Chunk.NEWLINE); phrase.Add(new Chunk("Type Of Crime :", normalFont)); phrase.Add(dr[2].ToString()); phrase.Add(Chunk.NEWLINE); phrase.Add(Chunk.NEWLINE); phrase.Add(Chunk.NEWLINE); phrase.Add(new Chunk("Location :", normalFont)); phrase.Add(dr[3].ToString()); phrase.Add(Chunk.NEWLINE); phrase.Add(Chunk.NEWLINE); phrase.Add(Chunk.NEWLINE); phrase.Add(new Chunk("Citizen Report Date Time :", normalFont)); phrase.Add(dr[4].ToString()); phrase.Add(Chunk.NEWLINE); phrase.Add(Chunk.NEWLINE); phrase.Add(Chunk.NEWLINE); phrase.Add(new Chunk("Police ID :", normalFont)); phrase.Add(dr[5].ToString()); phrase.Add(Chunk.NEWLINE); phrase.Add(Chunk.NEWLINE); phrase.Add(Chunk.NEWLINE); phrase.Add(new Chunk("Police Report Date Time :", normalFont)); phrase.Add(dr[6].ToString()); phrase.Add(Chunk.NEWLINE); phrase.Add(Chunk.NEWLINE); phrase.Add(Chunk.NEWLINE); phrase.Add(new Chunk("Citizen Report :", normalFont)); phrase.Add(dr[7].ToString()); phrase.Add(Chunk.NEWLINE); phrase.Add(Chunk.NEWLINE); phrase.Add(Chunk.NEWLINE); phrase.Add(new Chunk("Police Report :", normalFont)); phrase.Add(dr[8].ToString()); phrase.Add(Chunk.NEWLINE); phrase.Add(Chunk.NEWLINE); phrase.Add(Chunk.NEWLINE); phrase.Add(new Chunk("Official Report :", normalFont)); phrase.Add(dr[9].ToString()); phrase.Add(Chunk.NEWLINE); phrase.Add(Chunk.NEWLINE); phrase.Add(Chunk.NEWLINE); phrase.Add(new Chunk("Image :", normalFont)); Byte[] bytes = (Byte[])dr[0]; Response.Buffer = true; Response.Charset = ""; Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.ContentType = "image/jpg"; Response.BinaryWrite(bytes); Response.Flush(); Response.End(); phrase.Add(bytes); table.AddCell(phrase); } dr.Close(); doc1.Add(table); doc1.Close(); 

要在使用iTextSharp创建PDF时添加图像,您应该使用Image类(来自iTextSharp.text命名空间)。 这个类有许多静态辅助方法GetInstance重载,它们有助于创建一个Image实例,参见 来源 。 在您的情况下,很可能只有一个byte[]参数的重载将执行:

 using iTextSharp.text; [...] Byte[] bytes = (Byte[])dr[10]; Image image = Image.GetInstance(bytes); Chunk imageChunk = new Chunk(image, 0, 0); phrase.Add(imageChunk); 

我在你的代码中看到了两个主要问题。 可能还有其他人,但让我们从这些开始:

  1. 你有: Response.ContentType = "image/jpg"; 但是您正在创建PDF,而您的问题表明您正在向浏览器发送PDF,而不是图像。 你需要Response.ContentType = "application/pdf"
  2. 我假设Byte[] bytes代表一个图像。 它击败了我为什么你要将这些图像字节直接添加到Phrase对象。 Phrase对象究竟应该知道这些字节应该转换为Image对象吗? 你已经跳过了几个步骤。 首先,您需要创建一个Image对象,然后将该图像包装在Chunk ,然后将该块添加到Phrase

有关创建图像的示例,请浏览http://tinyurl.com/itextsharpIIA2C10

如果你想知道大块的包装图像是什么,请阅读我书第2章的最后几页。