image pdf datatable itextsharp

iTextSharp-Agregar imagen a PDF desde Datatable



(2)

He sugerido los pasos que muestran cómo agregar imágenes a PDF, a continuación se muestra el fragmento de código que muestra cómo agregar el logotipo a su PDF usando iTextsharp, siga los pasos a continuación proporcionados:

  1. He proporcionado un enlace para descargar el componente "itextsharp" del enlace dado http://sourceforge.net/projects/itextsharp/
  2. Tienes que agregar referencia en tu aplicación.
  3. A continuación, debe agregar los espacios de nombres necesarios "iTextsharp.text.html", "iTextsharp.text" para consumir sus mejores propiedades.
  4. Ahora tiene que agregar un fragmento de código en la aplicación que se proporciona al final, agregue un fragmento de código debajo de "clic de botón" en el código de atrás.

Espero que funcione para ti!

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); } }

Intento crear un informe PDF desde una tabla de datos. Una de las columnas contiene una imagen. ¿Cómo puedo extraer la imagen de la tabla de datos e insertarla en la tabla PDF? Estoy usando iTextShap versión 5.4.2.0. Aquí está el código:

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(); }

Actualización: @nekno, todas sus sugerencias están funcionando.

Pero aún necesito corregir el lanzamiento en la línea:

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

Me dio una excepción de lanzamiento de VS2008. Así que agregué la función de conversión (extraída de 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; }

Y revisó el código:

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

Gracias.


¿Cuál es el problema exactamente? ¿Qué sucede cuando usas tu código de problema?

Pruebe con una de las otras sobrecargas Image.GetInstance() :

Puede pasar la matriz de bytes directamente:

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

O puedes pasar el Stream :

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

O puede darle a iTextSharp más información sobre el formato de la imagen:

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);

Si su columna se puede convertir a System.Drawing.Image , puede usarla directamente:

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