เริ่มต้นสร้าง Class ขึ้นมาเพื่อใช้สำหรับทำงานเกี่ยวกับ Pdf ใช้ชื่อว่า PdfManager
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
/// <summary>
/// Summary description for PdfManager
/// </summary>
public static class PdfManager
{
public static void ExportFromGridView(GridView gvControl)
{
}
}
ในตัวอย่างนี้ผมจะใช้ iTextSharp ซึ่งเป็น Library ตัวนึงในการทำงานเกี่ยวกับ Pdf เพื่อสร้างเอกสาร Pdf ได้ง่าย เพราะมี Method ต่างๆไว้สำหรับเีรียกใช้งานอยู่แล้ว สามารถติดตั้งได้โดยโหลดจาก Nuget หรือจาก Package Manager Console (อ้างอิง : https://www.nuget.org/packages/itextsharp/)
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using iTextSharp.text.pdf;
using iTextSharp.text;
using System.Data;
/// <summary>
/// Summary description for PdfManager
/// </summary>
public static class PdfManager
{
public static void ExportFromGridView(GridView gvControl)
{
// สร้าง BaseFont
BaseFont bf = BaseFont.CreateFont(HttpContext.Current.Server.MapPath("~/Fonts/ANGSA_0.TTF"), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
// กำหนดขนาดของ Pdf
Document pdfDoc = new Document(PageSize.A4, 10, 10, 10, 10);
try
{
// สร้าง instance ของ PdfWriter
PdfWriter.GetInstance(pdfDoc, System.Web.HttpContext.Current.Response.OutputStream);
pdfDoc.Open();
// สร้าง Font จาก BaseFont
Font fnt = new Font(bf, 11);
// สร้าง PdfTable จาก GridView Control
PdfPTable PdfTable = new PdfPTable(gvControl.Columns.Count);
PdfPCell PdfPCell = null;
// Write Header ที่ PdfCell ใน PdfTable
for (int column = 0; column < gvControl.Columns.Count; column++)
{
PdfPCell = new PdfPCell(new Phrase(new Chunk(gvControl.Columns[column].HeaderText.ToString(), fnt)));
PdfTable.AddCell(PdfPCell);
}
// Write Data ที่ PdfCell ใน PdfTable
for (int row = 0; row < gvControl.Rows.Count; row++)
{
PdfPCell = new PdfPCell(new Phrase(new Chunk(gvControl.Rows[row].Cells[1].Text, fnt)));
PdfTable.AddCell(PdfPCell);
PdfPCell = new PdfPCell(new Phrase(new Chunk(gvControl.Rows[row].Cells[2].Text, fnt)));
PdfTable.AddCell(PdfPCell);
PdfPCell = new PdfPCell(new Phrase(new Chunk(gvControl.Rows[row].Cells[3].Text, fnt)));
PdfTable.AddCell(PdfPCell);
PdfPCell = new PdfPCell(new Phrase(new Chunk(gvControl.Rows[row].Cells[4].Text, fnt)));
PdfTable.AddCell(PdfPCell);
PdfPCell = new PdfPCell(new Phrase(new Chunk(gvControl.Rows[row].Cells[5].Text, fnt)));
PdfTable.AddCell(PdfPCell);
PdfPCell = new PdfPCell(new Phrase(new Chunk(gvControl.Rows[row].Cells[6].Text, fnt)));
PdfTable.AddCell(PdfPCell);
}
// Add PdfTable ลง pdfDoc
pdfDoc.Add(PdfTable);
// Close document
pdfDoc.Close();
// กำหนด ContentType เป็น application/pdf เพื่อ Response เป็น Pdf
HttpContext.Current.Response.ContentType = "application/pdf";
// กำหนดชื่อไฟล์ที่ต้องการ Export
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + DateTime.Now.ToString("yyyyMMdd") + ".pdf");
// Export Pdf
System.Web.HttpContext.Current.Response.Write(pdfDoc);
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
}
catch (Exception ex)
{
HttpContext.Current.Response.Write(ex.ToString());
}
}
}
ในส่วน Code ข้างบนมี Code ที่น่าสนใจ คือ ในส่วนของการกำหนด BaseFont
ในส่วนมีข้อสังเกต คือ ผมได้สร้าง Path สำหรับเก็บ Font ภายใน Solution เพือให้สามารถอ้างอิงถึง Font นั้น โดยการ Embded ลงไป ทุกครั้งที่เราสร้าง Instance ของ Font ให้ส่ง BaseFont ไปด้วย ดังนี้
BaseFont bf = BaseFont.CreateFont(HttpContext.Current.Server.MapPath("~/Fonts/ANGSA_0.TTF"), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
ตอนนี้ก็สร้าง Class สำหรับจัดการเกียวกับการ Export ข้อมูลเรียบร้อย จากนั้นสามารถเรียกใช้งาน ดังนี้
Font fnt = new Font(bf, 11);
จาก Code ช้างบนมีประโยชน์ คือ จะช่วยแก้ปัญหาในเรื่องของ Pdf ไม่สามารถแสดงภาษาไทย
protected void btnExport_Click(object sender, EventArgs e)
{
try
{
PdfManager.ExportPdf(gvColourFormula);
}
catch (Exception ex)
{
}
}
ขอบคุณครับบ
ตอบลบมีของ vb.net ที่ข้อมูล table มาจาก datagridview ไหมครับ
ตอบลบดีงามม
ตอบลบจริงงงงงงงงงค่ะ
ลบสวยงาม
ลบขอบคุณมากครับ
ตอบลบขอ VB.net ด้วยหน่อยได้มั้ยค่ะ มือใหม่หัดทำ ทำตัว Report อื่นติดเรื่องfont ทั้งหมดเลยT^T
ตอบลบฝากติดตาม Blog ด้วยนะครับ ตอนนี้ย้ายไปเขียนที่ http://www.joyzie.net ครับ
ตอบลบitextshep ฟรีไหมครับ และ หากเราเอาไปใช้ในเชิงภานิชย์ จะเป็นไรไหมครับ
ตอบลบ