5

データテーブルから PDF レポートを作成しようとしています。コラム内容の画像の1つ。データテーブルから画像を抽出して 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();            
}

更新: @nekno、あなたの提案はすべて有効です。

しかし、次の行でキャストを修正する必要があります。

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

VS2008 からキャスト例外が発生しました。そこで、変換関数を追加しました (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]);

ありがとう。

4

2 に答える 2

8

問題は正確には何ですか?問題コードを使用するとどうなりますか?

Image.GetInstance()他のオーバーロードのいずれかを試してください。

バイト配列を直接渡すことができます:

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 に与えることができます。

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、それを直接使用できます。

Image img = Image.GetInstance((System.Drawing.Image)r[6], System.Drawing.Imaging.ImageFormat.Png);
于 2013-07-11T20:26:56.993 に答える
3

以下のコード スニペットは、iTextsharp を使用して PDF にロゴを追加する方法を示しています。以下の手順に従ってください。

  1. 指定されたリンクから「itextsharp」コンポーネントをダウンロードするためのリンクを提供しましたhttp://sourceforge.net/projects/itextsharp/
  2. アプリケーションに参照を追加する必要があります。
  3. 次に、必要な名前空間「iTextsharp.text.html」、「iTextsharp.text」を追加して、最適なプロパティを使用する必要があります。
  4. 次に、最後に指定されたコード スニペットをアプリケーションに追加する必要があります。コード ビハインドの「ボタン クリック」の下にコード スニペットを追加します。

それがあなたのために働くことを願っています!!!

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);
        }
    }    
于 2013-12-25T17:49:39.087 に答える