Friday, August 15, 2008

HOW TO: ASP.NET Generate PDF Output

สวัสดีครับ สำหรับในบทความนี้นะครับ จะเป็นบทความต่อจาก คราวที่แล้ว คือ วิธีการเขียน asp.net ให้ gen ข้อมูลออกมาเป็น PDF file ครับ

กล่าวนำนิดนึง หลายคนที่พัฒนา web application ด้วย asp.net คงจะ เจอปัญหา เวลาสั่ง print report ซึ่ง เมื่อ เราสั่ง print แล้วโดยปกติ จะได้ url อันไม่พึงประสงค์ติด มาพร้อมกับ รายงานด้วยนะครับ
วิธีการที่จะทำให้ เวลาที่เราสั่ง print แล้ว ได้ออกมาเป็นรูปแบบรายงานที่สวยงาม ไม่มี url ติดมา นั้น เราจำเป็นต้องทำ ออกมาเป็น PDF ไฟล์ก่อน จากนั้นถึงจะสั่ง print นะครับ

ซึ่งการทำ ให้ asp.net export ออกมาเป็น pdf มีอยู่มากมายหลายวิธี หรือใช้ component ช่วย ก็มีหลายตัว ทั้งเสียเงิน และไม่เสียเงิน

สำหรับวิธีการนี้ ผมจะใช้ component ฟรี ที่ช่วยในการ เขียน PDF นะครับ โดยผมขอแนะนำตัวช่วย ที่ได้กล่าวไปเมื่อกี้นะครับ คือ Itextsharp
หลายๆ คนคงจะรู้จัก กันพอสมควรแล้วนะครับ ว่า itextsharp คือ open source ที่พัฒนาขึ้นมาเพื่อ ทำงานกับ เอกสารได้เป็นอย่างดี โดยจะสามารถดาวน์โหลด component ได้ที่ http://itextsharp.sourceforge.net/ เมื่อดาวน์โหลดมาแล้ว เราจะได้ไฟล์ itextsharp.dll มา ตัวนี้แหละครับที่เราจะเอามา add reference เข้ามาใน Project ของเรา เพื่อเขียน gen pdf ไฟล์ครับ

ขั้นตอนในการใช้งาน Itextsharp เพื่อ เขียน PDF
1. เปิด vs.net ขึ้นมา สร้าง project ขึ้นจากนั้น ก็ทำการ add reference ไฟล์ itextsharp.dll ที่ดาวน์โหลด มา เข้าไปไว้ในโปรเจค เพื่อจะสามารถใช้งาน library ต่างๆได้
2. ที่ส่วนหัวของหน้า code ให้ทำการ import namespace เข้ามา

using iTextSharp.text;
using iTextSharp.text.pdf;

3. ส่วนโคดที่จะใช้ในการเขียน เพื่อสร้างเอกสาร pdf นั้น จะให้อยู่ใน event page_load นะครับ แล้วเขียนดังนี้
// ขั้นแรก จะต้องทำการ create object document ขึ้นมา
Document document = new Document(); // การ create document แบบแนว ตั้งปกติ ซึ่งเราอาจจะ จัดเอกสารให้เป็นขนาดอื่นๆ หรือ เป็นแนวตั้งได้ดังนี้
// Document document = new Document(PageSize.A4.Rotate(),20,20,20,20);
// ส่วนที่เป็น สีน้ำเงิน คือ ส่วนที่จะระบุเข้าไปในเอกสาร คือ ให้มีขนาด เป็น A4 และ สีแดงคือ margin ของเอกสาร

string filename = Server.MapPath("
../report_pdf/ชื่อไฟล์.pdf"); // กำหนด path และชื่อไฟล์
PdfWriter.GetInstance(document, new FileStream(filename, FileMode.Create));


// เริ่มทำการ Add meta information ของเอกสาร
document.AddAuthor("Test asp.net gen Report PDF");
document.AddSubject("This is the result of Report.");
document.Open(); // เปิด object เอกสารเพื่อทำการเขียนข้อมูล

// กำหนด font ภาษาไทย เราสามารถกำหนด ชนิดของ font ได้ว่าจะให้เป็น font ตัวไหน หรือจะ upload font ขึ้นไปไว้บน server แล้วทำการ อ้าง path ก็ได้นะครับ หากไม่กำหนด font เราจะสามารถใช้ ภาษาไทย ได้นะครับ
BaseFont EnCodefont = BaseFont.CreateFont(Server.MapPath("../font/ANGSA.TTF"), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font Nfont= new Font(EnCodefont, 18, Font.NORMAL, new Color(0, 0, 255));
// ===================

// การเขียน ข้อมูลลงใน PDF นั้นทำได้ ด้วยการใช้ method add และ ข้อมูลที่จะใส่ไว้ใน method add นั้น เราสามารถ สร้าง object ข้อมูลได้ หลายอย่างมากครับ ผมจะขอ นำเสอน ทีละอย่างนะครับ
// อย่างแรก การสร้างข้อมูลด้วย object paragraph แล้วกำหนด รูปแบบ font ด้วยตัวแปร Nfont ที่ได้สร้างไว้
document.Add(new Paragraph("รายงานข้อมูลประจำวันที่ " + DateTime.ToString("dd/MM/yyyy"), Nfont));
document.Close();

// อย่างที่สองการสร้าง เป็น table ด้วย object table
Table DT = new Table(4); // สร้าง table columns 4 columns
DT.Padding = 2; // กำหนด ระยะของ ขอบ ตารางและตัวอักษร
DT.Spacing = 0; //กำหนดระยะของขอบตาราง
DT.DefaultHorizontalAlignment = Element.ALIGN_CENTER; // จัดเรียก alignment
DT.DefaultVerticalAlignment = Element.ALIGN_TOP;
float[] headerwidths = { 12, 18, 10, 10 }; // กำหนด ความกว้างของ columns
DT.Widths = headerwidths;
DT.WidthPercentage = 100;
DT.AddCell(new Phrase("ลำดับ", Sfont)); // columns 1
DT.AddCell(new Phrase("ชื่อ - นามสกุล", Sfont)); // columns 2
DT.AddCell(new Phrase("เพศ", Sfont)); // columns 3
DT.AddCell(new Phrase("อายุ", Sfont)); // columns 4

// เมื่อได้ object tableของข้อมูลมาแล้ว ก็จะทำการ Add ใน method add ของ object document
document.Add(DT);
document.Close();

// เพียงเท่านี้ เราก็จะสามารถ create PDF ไฟล์ได้แล้วครับ
// ที่เหลือ ก็จะเป็นการ นำเอาไปปรับเปลี่ยนวิธีการเพื่อแสดง ผล แล้วก็ advance ต่อไป ซึ่ง จะมีทั้งตัวอย่าง การทำในแบบต่างๆ อยู่ในไฟล์ ที่ itextsharp ได้ทำไว้ให้เป็น sample ด้วยมากมาย ผมขอ ยกมากล่าว เพียงเท่านี้นะครับ