从Datatable添加图像到PDF

从Datatable添加图像到PDF

本文介绍了iTextSharp - 从Datatable添加图像到PDF的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I try to create a PDF report from a datatable. One of the columns contents image. How can I extract the image from datatable and insert into PDF table? I'm 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();
}

更新: @nekno,所有建议工作。

Update: @nekno, all of your suggestions are worked.

但是我仍需要在线上更正投票:

But I still need to correct the casting at line:

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

它给了我来自VS2008的投射异常。所以我添加了转换函数(从stackoverflow中取出):

It gave me a casting exception from VS2008. So I added the 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;
    }

并修改了代码:

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

谢谢。

推荐答案

究竟是什么问题?使用问题代码时会发生什么?

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

尝试其中一个 Image.GetInstance()重载:

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

You can pass the byte array directly:

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

或者你可以传递 Stream

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

或者你可以给iTextSharp更多关于图像格式的信息:

Or you can give iTextSharp more info 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);

如果您的列可以转换为 System.Drawing.Image ,然后你可以直接使用它:

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

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

这篇关于iTextSharp - 从Datatable添加图像到PDF的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-23 03:06