Image iTextSharp-将图像从Datatable添加到PDF

Image iTextSharp-将图像从Datatable添加到PDF,image,pdf,datatable,itextsharp,Image,Pdf,Datatable,Itextsharp,我尝试从数据表创建PDF报告。其中一列内容为图像。如何从datatable中提取图像并插入到PDF表中?我正在使用iTextShap版本5.4.2.0。代码如下: public void Report(DataTable dt, string output) { Document doc = new Document(PageSize.LETTER, 50, 50, 80, 50); PdfWriter PDFWriter

我尝试从数据表创建PDF报告。其中一列内容为图像。如何从datatable中提取图像并插入到PDF表中?我正在使用iTextShap版本5.4.2.0。代码如下:

    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();            
}
byte[] byt = ImageToByte((System.Drawing.Image)dt.Rows[e][6]);
它给了我一个VS2008的铸造例外。因此,我添加了转换函数(从stackoverflow中提取):

并修订守则:

    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();            
}
byte[] byt = ImageToByte((System.Drawing.Image)dt.Rows[e][6]);

谢谢。

到底是什么问题?使用问题代码时会发生什么

请尝试另一个
Image.GetInstance()
重载:

您可以直接传递字节数组:

byte[] byt = (byte[])r[6];
Image img = Image.GetInstance(byt);
Image img = Image.GetInstance((System.Drawing.Image)r[6], System.Drawing.Imaging.ImageFormat.Png);
或者您可以传递

byte[] byt = (byte[])r[6];
MemoryStream ms = new MemoryStream(byt);
Image img = Image.GetInstance(ms);
或者,您可以向iTextSharp提供有关图像格式的更多信息:

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

如果可以将列转换为
System.Drawing.Image
,则可以直接使用它:

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

我建议了如何将图像添加到PDF中的步骤,下面给出了如何使用iTextsharp将徽标添加到PDF中的代码片段,请按照以下步骤操作:

  • 我提供了从给定链接下载“itextsharp”组件的链接
  • 您必须将引用添加到应用程序中
  • 接下来,您必须添加所需的名称空间“iTextsharp.text.html”、“iTextsharp.text”以使用其最佳属性
  • 现在,您必须将代码段添加到最后给出的应用程序中,在代码隐藏中的“按钮单击”下添加代码段 希望它能为你工作

    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);
            }
        }    
    
    protectedvoid btnPDF\u点击(对象发送者,图像点击事件参数e)
    {
    DataTable dtn=新的DataTable();
    dtn=GetDataTable();
    dtPDF=dtn.Copy();
    
    对于(int i=0;实际上,我已经考虑了您所有的建议,谢谢您。如果您的专栏可以转换为
    System.Drawing.Image
    ,那么您可以直接使用它:
    Image img=Image.GetInstance((System.Drawing.Image)r[6],System.Drawing.Imaging.ImageFormat.Png);