[ASP.NET]以iTextSharp手繪表格並產生PDF下載

[ASP.NET]以iTextSharp手繪表格並產生PDF下載

大家使用iTextSharp的機緣都不太一樣, 由於單位Crystal Report的License數量有限主管要我去找一個免費產生PDF方法, 避免Crystal Report的License使用過多, 於是乎就找上了iTextSharp.

 Crystal Report 與 iTextSharp比較表

 Crystal ReportiTextSharp
視覺化界面YESNO
轉換成PDFYESYES
費用YESNO
 
第一次總是特別辛苦的, 為了畫出一張收據, 沒有視覺化界面的幫忙, 透過大腦的想像, 終於完成了任務, 但是對於使用Crystal Report的老手們, 應該相當不習慣, 因為看不見畫的東西, 對他們是不方便的, 但可以省錢, 我想老闆不會說不, 最後我把我學習的成果做成一個範例.
 
請記得先去網站下載iTextSharp.dll這個檔案加入參考 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //文件初始化
        Document Doc= new Document();

        MemoryStream Memory= new MemoryStream();

        PdfWriter PdfWriter = PdfWriter.GetInstance(Doc, Memory);

        //字型設定
        string FontPath = Server.MapPath("kaiu.ttf");

        BaseFont bfChinese = BaseFont.CreateFont(FontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

        Font ChFont = new Font(bfChinese, 9);

        //文件開啟
        Doc.Open();

        //設定表格需要幾攔幾列 (如果不設列,可能會在使用RowSpan或ColSpan發生錯誤)
        iTextSharp.text.Table Tb = new iTextSharp.text.Table(4,5);
        //設定表格的Padding
        Tb.Padding = 4;
        //自動填滿欄位(如果沒有填滿欄位,不會畫出欄位的線條)       
        Tb.AutoFillEmptyCells = true;

        //抬頭
        Paragraph Title = new Paragraph("iTextSharp畫表格測試", ChFont);
        //內容水平置中
        Title.SetAlignment("center");

        //Cell內容
        iTextSharp.text.Cell Tc;
        Tc= new iTextSharp.text.Cell(new Phrase("點部落",ChFont));
        //內容水平置中
        Tc.HorizontalAlignment = Element.ALIGN_CENTER;
        //內容高度置中 (Top,Middle感覺不到有沒有移動)
        Tc.VerticalAlignment = Element.ALIGN_TOP;
        Tc.Rowspan = 2;
        Tc.Colspan = 2;
        
        //將Cell加入表格
        Tb.AddCell(Tc);

        Tc = new iTextSharp.text.Cell(new Phrase("www.dotblogs.com.tw", ChFont));
        //內容水平置中
        Tc.HorizontalAlignment = Element.ALIGN_CENTER;
        //內容高度置中(Top,Middle感覺不到有沒有移動)
        Tc.VerticalAlignment = Element.ALIGN_TOP;
        Tc.Rowspan = 2;
        Tc.Colspan = 2;

        Tb.AddCell(Tc);
      
        //加入抬頭
        Doc.Add(Title);
        //把表格加入文件
        Doc.Add(Tb);

        //開啟新的一頁
        Doc.NewPage();

        //加入抬頭
        Doc.Add(Title);
        //把表格加入文件
        Doc.Add(Tb);

        //文件關閉
        Doc.Close();


        //檔案下載
        Response.Clear();
        Response.AddHeader("Content-Disposition", "attachment; filename=pdfExample.pdf");
        Response.ContentType = "application/octet-stream";

        Response.OutputStream.Write(Memory.GetBuffer(), 0, Memory.GetBuffer().Length);
        Response.OutputStream.Flush();
        Response.OutputStream.Close();
        Response.Flush();
        Response.End();

    }
}