ITextSharp - Add PDF Image from Datatable

I am trying to create a PDF report from data. One of the columns contains an image. How can I extract an image from a datatable and paste into a pdf table? I am using iTextShap version 5.4.2.0. Here is the code:

public void Report(DataTable dt, string output) { Document doc = new Document(PageSize.LETTER, 50, 50, 80, 50); PdfWriter PDFWriter = PdfWriter.GetInstance(doc, new FileStream(output, FileMode.Create)); PDFWriter.ViewerPreferences = PdfWriter.PageModeUseOutlines; iTextSharp.text.Font hel8 = FontFactory.GetFont(BaseFont.HELVETICA, 8); doc.Open(); PdfPTable table = new PdfPTable(dt.Columns.Count); float[] widths = new float[] { 1.2f, 1.2f, 1.2f, 1.2f, 1f, 4f, 1f, 4f }; table.SetWidths(widths); table.WidthPercentage = 100; PdfPCell cell = new PdfPCell(new Phrase("NewCells")); cell.Colspan = dt.Columns.Count; foreach (DataColumn c in dt.Columns) { table.AddCell(new Phrase(c.ColumnName, hel8)); } foreach (DataRow r in dt.Rows) { if (dt.Rows.Count > 0) { table.AddCell(new Phrase(r[0].ToString(), hel8)); table.AddCell(new Phrase(r[1].ToString(), hel8)); table.AddCell(new Phrase(r[2].ToString(), hel8)); table.AddCell(new Phrase(r[3].ToString(), hel8)); table.AddCell(new Phrase(r[4].ToString(), hel8)); table.AddCell(new Phrase(r[5].ToString(), hel8)); byte[] byt = (byte[])r[6]; MemoryStream ms = new MemoryStream(byt); System.Drwaing.Image sdi = System.Drawing.Image.FromStream(ms); Image img = Image.GetInstance(sdi); <-- this is the problem code table.AddCell(img); table.AddCell(new Phrase(r[7].ToString(), hel8)); } } doc.Add(table); } doc.Close(); } 

Update: @nekno, all your suggestions work.

But I still need to fix the cast in the line:

 byte[] byt = (byte[])r[6]; 

This gave me an exception for an exception from VS2008. So I added a conversion function (pulled it from stackoverflow):

 byte[] ImageToByte(System.Drawing.Image img) { byte[] byteArray = new byte[0]; using (MemoryStream stream = new MemoryStream()) { img.Save(stream, System.Drawing.Imaging.ImageFormat.Png); stream.Close(); byteArray = stream.ToArray(); } return byteArray; } 

And changed the code:

 byte[] byt = ImageToByte((System.Drawing.Image)dt.Rows[e][6]); 

Thanks.

+4
source share
2 answers

What exactly is the problem? What happens if you use your problem code?

Try using one of the other Image.GetInstance() overloads:

You can pass an array of bytes directly:

 byte[] byt = (byte[])r[6]; Image img = Image.GetInstance(byt); 

Or you can pass Stream :

 byte[] byt = (byte[])r[6]; MemoryStream ms = new MemoryStream(byt); Image img = Image.GetInstance(ms); 

Or you can provide iTextSharp with additional information about the image format:

 byte[] byt = (byte[])r[6]; MemoryStream ms = new MemoryStream(byt); System.Drawing.Image sdi = System.Drawing.Image.FromStream(ms); Image img = Image.GetInstance(sdi, ImageFormat.Png); 

If your column can be attributed to System.Drawing.Image , you can use it directly:

 Image img = Image.GetInstance((System.Drawing.Image)r[6], System.Drawing.Imaging.ImageFormat.Png); 
+6
source

I suggested steps to show how to add an image to a PDF, the code snippet below shows how to add a logo to your PDF using iTextsharp, follow these steps:

  • I have provided a link to download the "itextsharp" component from this link http://sourceforge.net/projects/itextsharp/
  • You must add the link to your application.
  • Then you need to add the necessary namespaces "iTextsharp.text.html", "iTextsharp.text" in order to use its best properties.
  • Now you need to add the code fragment to your application, indicated at the end, add the code fragment under the "click" button in the code.

Hope this works for you !!!

 protected void btnPDF_Click(object sender, ImageClickEventArgs e) { DataTable dtn = new DataTable(); dtn = GetDataTable(); dtPDF = dtn.Copy(); for (int i = 0; i <= dtn.Rows.Count - 1; i++) { ExportToPdf(dtPDF); } } public void ExportToPdf(DataTable myDataTable) { Document pdfDoc = new Document(PageSize.A4, 10, 10, 10, 10); try { PdfWriter.GetInstance(pdfDoc, System.Web.HttpContext.Current.Response.OutputStream); pdfDoc.Open(); Chunk c = new Chunk("" + System.Web.HttpContext.Current.Session["CompanyName"] + "", FontFactory.GetFont("Verdana", 11)); Paragraph p = new Paragraph(); p.Alignment = Element.ALIGN_CENTER; p.Add(c); pdfDoc.Add(p); string clientLogo = Server.MapPath(".") + "/logo/tpglogo.jpg"; string imageFilePath = Server.MapPath(".") + "/logo/tpglogo.jpg"; iTextSharp.text.Image jpg = iTextSharp.text.Image.GetInstance(imageFilePath); //Resize image depend upon your need jpg.ScaleToFit(80f, 60f); //Give space before image jpg.SpacingBefore = 0f; //Give some space after the image jpg.SpacingAfter = 1f; jpg.Alignment = Element.HEADER; pdfDoc.Add(jpg); Font font8 = FontFactory.GetFont("ARIAL", 7); DataTable dt = myDataTable; if (dt != null) { //Craete instance of the pdf table and set the number of column in that table PdfPTable PdfTable = new PdfPTable(dt.Columns.Count); PdfPCell PdfPCell = null; for (int rows = 0; rows < dt.Rows.Count; rows++) { for (int column = 0; column < dt.Columns.Count; column++) { PdfPCell = new PdfPCell(new Phrase(new Chunk(dt.Rows[rows][column].ToString(), font8))); PdfTable.AddCell(PdfPCell); } } //PdfTable.SpacingBefore = 15f; // Give some space after the text or it may overlap the table pdfDoc.Add(PdfTable); // add pdf table to the document } pdfDoc.Close(); Response.ContentType = "application/pdf"; Response.AddHeader("content-disposition", "attachment; filename= SampleExport.pdf"); System.Web.HttpContext.Current.Response.Write(pdfDoc); Response.Flush(); Response.End(); //HttpContext.Current.ApplicationInstance.CompleteRequest(); } catch (DocumentException de) { System.Web.HttpContext.Current.Response.Write(de.Message); } catch (IOException ioEx) { System.Web.HttpContext.Current.Response.Write(ioEx.Message); } catch (Exception ex) { System.Web.HttpContext.Current.Response.Write(ex.Message); } } 
+3
source

Source: https://habr.com/ru/post/1490993/


All Articles