我正在尝试从我的SQL服务器检索二进制图像数据,并使用以下方法将其导出到我的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();
答案 0 :(得分:2)
要在使用iTextSharp创建PDF时添加图像,您应该使用Image
类(来自iTextSharp.text
命名空间)。这个类有许多静态辅助方法GetInstance
重载,这有助于创建Image
实例,参见the source。在您的情况下,很可能只有一个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 :(得分:0)
我发现代码中存在两个主要问题。可能还有其他人,但让我们从这些开始:
Response.ContentType = "image/jpg";
但是您正在创建PDF,而您的问题显示您正在向浏览器发送PDF,而不是图像。您需要Response.ContentType = "application/pdf"
。Byte[] bytes
表示图像。它击败了我为什么要将这些图像字节直接添加到Phrase
对象。 Phrase
对象应该如何知道这些字节应该转换为Image
对象?你已经跳过了几个步骤。首先,您需要创建一个Image
对象,然后将该图像包装在Chunk
中,然后将该块添加到Phrase
。有关创建图片的示例,请浏览http://tinyurl.com/itextsharpIIA2C10
如果您想知道块中包装图像的内容,请阅读本书chapter 2的最后几页。