Tuesday, February 21, 2006

iTextSharp: Generate a PDF file containing a table (ASP.NET/C#)

Contining on from iTextSharp: Generating a Basic PDF file (ASP.NET/C#), here is a demo of how to generate a PDF document with a table in it.

TablePDF.ashx

<%@ WebHandler Language="C#" Class="MyNamespace.TablePDF" %>
using System;
using System.IO;
using System.Web;
using iTextSharp.text;
using iTextSharp.text.pdf;
namespace MyNamespace
{
 public class TablePDF: IHttpHandler 
 {
  
  public bool IsReusable
  {
   get
   {
    return true;
   }
  }
  
  /// <summary>
  /// Font used for table headers
  /// </summary>
  private Font TableHeaderFont
  {
   get
   {
    return new Font(Font.HELVETICA, Font.DEFAULTSIZE, Font.BOLD);
   }
  }
  
  public void ProcessRequest(HttpContext ctx)
  {
   // make sure it is sent as a PDF
   ctx.Response.ContentType="application/pdf";
   // make sure it is downloaded rather than viewed in the browser window
   ctx.Response.AddHeader("Content-disposition", "attachment; filename=TablePDF.pdf");
   
   // create a MemoryStream (as there may not be write access to any folder on the server)
   using(MemoryStream m = new MemoryStream())
   {
    // create the PDF document
    Document document = new Document(PageSize.A4);
    PdfWriter.GetInstance(document, m);
    
    // open document to add content
    document.Open();
    
    // add table with 3 columns
    Table myTable = new Table(3);
    myTable.AutoFillEmptyCells = true;
    // add padding to table cells
    myTable.Cellpadding = 3.5f;
    // make sure table fits the width of the page
    myTable.WidthPercentage = 100.0f;
    
    // remove borders
    //myTable.DefaultCellBorder = Rectangle.NO_BORDER;
    //myTable.Border = Rectangle.NO_BORDER;
    
    // create cell
    Cell myCell = new Cell();
    
    // add header cell
    myCell.Header = true;
    myCell.Add(new Chunk("Header 1",TableHeaderFont));
    // row 1 column 1
    myTable.AddCell(myCell, 0, 0);
    
    // new header
    myCell = new Cell();
    myCell.Header = true;
    myCell.Add(new Chunk("Header 2",TableHeaderFont));
    // row 1 column 2
    myTable.AddCell(myCell, 0, 1);
 
    // another new header
    myCell = new Cell();
    myCell.Header = true;
    myCell.Add(new Chunk("Header 3",TableHeaderFont));
    // row 1 column 3
    myTable.AddCell(myCell, 0, 2);
 
    // add some data (6 rows worth)
    for (int i=1; i<=6; i++)
    {
     // on the third iteration, span several columns
     if(i == 3)
     {
      myCell = new Cell();
      myCell.Colspan = 3;
      myCell.HorizontalAlignment = Element.ALIGN_CENTER;
      myCell.Add(new Chunk("R" + (i + 1) + "C1 - " + "R" + (i + 1) + "C3"));
      myTable.AddCell(myCell, i, 0);
     }
     else
     {
      myCell = new Cell();
      myCell.Add(new Chunk("R" + (i + 1) + "C1"));
      myTable.AddCell(myCell, i, 0);
      
      myCell = new Cell();
      myCell.Add(new Chunk("R" + (i + 1) + "C2"));
      myTable.AddCell(myCell, i, 1);
      
      myCell = new Cell();
      myCell.Add(new Chunk("R" + (i + 1) + "C3"));
      myTable.AddCell(myCell, i, 2);
     }
    }
    // add table
    document.Add(myTable);
    
    // close the document
    document.Close();
    
    // stream the PDF to the user
    ctx.Response.OutputStream.Write(m.GetBuffer(), 0, m.GetBuffer().Length);
   }
   ctx.Response.End();
  }
 }
}

Tags: , , , , ,

No comments: