2013-07-11 2 views
4

데이터 테이블에서 PDF 보고서를 만들려고합니다. 내용 이미지 중 하나입니다. 데이터 테이블에서 이미지를 추출하고 PDF 테이블에 삽입하려면 어떻게해야합니까? iTextShap 버전 5.4.2.0을 사용하고 있습니다.iTextSharp - Datatable에서 PDF에 이미지 추가

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에서 나에게 캐스팅 예외를했다.

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

감사합니다.

+0

당신의 열이'System.Drawing.Image'에 캐스트 할 수있는 경우에, 당신은 직접 사용할 수 있습니다'이미지 IMG = Image.GetInstance ((System.Drawing.Image) R [6], 시스템 .Drawing.Imaging.ImageFormat.Png); ' – nekno

답변

6

정확히 무엇이 문제입니까? 문제 코드를 사용하면 어떻게됩니까?

은 다른 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 이미지 형식에 대한 자세한 정보 :

당신의 열이 System.Drawing.Image에 캐스트 할 수있는 경우 59,313,

, 당신은 직접 사용할 수 있습니다 : 나는 로고를 추가하는 방법 코드 쇼 아래에 주어진, PDF에 이미지를 추가하는 방법을 보여줍니다 방법 단계를 제안했다

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

사실, 모든 제안은 효과가 있으며 감사합니다. – andrewfam

3

당신은 당신의 응용 프로그램에 대한 참조를 추가 할 필요가 주어진 링크 http://sourceforge.net/projects/itextsharp/

  • 에서 구성 요소를 "itextsharp"를 다운로드 내가 링크를 제공 한

    1. : iTextsharp를 사용하여 PDF로, 단계 아래에 제공 팔로우 .
    2. 다음으로 최상의 속성을 사용하려면 "iTextsharp.text.html", "iTextsharp.text"라는 필수 네임 스페이스를 추가해야합니다.
    3. 이제 코드 스 니펫을 애플리케이션 끝에 추가하고 코드 스 니펫을 코드 뒤에있는 "버튼 클릭"아래에 추가해야합니다.

    희망은 당신을 위해 작동합니다!

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