:: Kunagorn Sirikup :: C# Developer

9/8/56

Export Pdf จาก GridView ให้รองรับภาษาไทย ด้วย iTextSharp

ในการทำงานจริงทุกระบบจะต้องมีการสร้างรายงานหรือ Report โดยทั่วไปก็อาจจะใช้ Crystal Report เพื้อสร้าง Report แต่วันนี้เราจะมาลองสร้าง Report ด้วย Pdf โดยใช้การ Export ข้อมูลจาก GridView ซึ่งการใช้ Pdf มีข้อดีั เมือใช้งานจริงไม่ต้องติดตั้ง Component หรือโปรแกรมต่างๆให้วุ่นวาย เพราะสามารถแสดง Report ได้จาก Pdf ซึ่งเป็นโปรแกรมพื้นฐานในเครื่องอยู่แล้ว

เริ่มต้นสร้าง 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)
    {
        
    }
}


9 ความคิดเห็น:

  1. ขอบคุณครับบ

    ตอบลบ
  2. มีของ vb.net ที่ข้อมูล table มาจาก datagridview ไหมครับ

    ตอบลบ
  3. คำตอบ
    1. จริงงงงงงงงงค่ะ

      ลบ
    2. ไม่ระบุชื่อ28/3/62 00:39

      สวยงาม

      ลบ
  4. ขอบคุณมากครับ

    ตอบลบ
  5. ขอ VB.net ด้วยหน่อยได้มั้ยค่ะ มือใหม่หัดทำ ทำตัว Report อื่นติดเรื่องfont ทั้งหมดเลยT^T

    ตอบลบ
  6. ฝากติดตาม Blog ด้วยนะครับ ตอนนี้ย้ายไปเขียนที่ http://www.joyzie.net ครับ

    ตอบลบ
  7. itextshep ฟรีไหมครับ และ หากเราเอาไปใช้ในเชิงภานิชย์ จะเป็นไรไหมครับ

    ตอบลบ