iTextSharp - 从数据表将图像添加到 PDF [英] iTextSharp - Add image to PDF from Datatable

查看:33
本文介绍了iTextSharp - 从数据表将图像添加到 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() 重载之一:

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

可以直接传递字节数组:

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 - 从数据表将图像添加到 PDF的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆