Veysel Uğur KIZMAZ

Asp.Net MVC WebGrid Verilerini PDF'e Aktarma (MVC Export to PDF)

14.08.2013Okunma Sayısı: 10920Kategori: ASP.NET MVC

Asp.Net MVC projelerinde kullandığınız WebGrid kontrolündeki verileri iTextSharp kullanarak PDF dosyası olarak alma işleminin nasıl yapıldığını öğrenelim.

Bu işlemi örnek bir uygulama üzerinden gerçekleştirelim. Öncelikle projede kullanacağımız iTextSharp’ı NuGet ile projeye ekleyelim.

NuGet ile iTextSharp (LGPL / MPL) indirme

Uygulamamızda Urun isminde bir class tanımlayalım ve WebGrid içinde Urun türündeki verileri listeleyelim.

Asp.Net MVC projemizde ürün bilgilerini bir class üzerinde oluşturalım. Ürünün Id, Ad, Fiyat ve Adet (stok miktarı) bilgilerinin bulunduğu Urun sınıfını oluşturalım.

public class Urun
{
    public int Id { get; set; }
    public string Ad { get; set; }
    public double Fiyat { get; set; }
    public int Adet { get; set; }
}

Ürün bilgilerimizi Veri isminde bir sınıf içerisinde static olarak tanımlayalım.

public class Veri
{
    private static List<Urun> _urunler = new List<Urun>()
    {
        new Urun{ Id = 1, Ad = "Masaüstü Bilgisayar", Fiyat = 1200, Adet = 20},
        new Urun{ Id = 2, Ad = "Laptop", Fiyat = 2000, Adet = 40},
        new Urun{ Id = 3, Ad = "Tablet", Fiyat = 800, Adet = 65},
        new Urun{ Id = 4, Ad = "SmartPhone", Fiyat = 1450, Adet = 230},
        new Urun{ Id = 5, Ad = "LCD TV", Fiyat = 1100, Adet = 55},
        new Urun{ Id = 6, Ad = "LED TV", Fiyat = 2200, Adet = 90},
        new Urun{ Id = 7, Ad = "Flat TV", Fiyat = 700, Adet = 30}
    };
    public static List<Urun> Urunler
    {
        get { return _urunler; }
    }
}

Projemizde HomeController içine UrunleriPDFeAktar isminde bir Action oluşturalım.

public ActionResult UrunleriPDFeAktar()
{
    return View();
}

Oluşturduğumuz actionın View’ını ekleyelim : Views > Home > UrunleriPDFeAktar.cshtml

View içerisinde Veri.Urunler listesindeki verileri WebGrid üzerinde görüntüleyelim.

<h2>Urunleri PDF'e Aktar</h2>
@{
    var grid = new WebGrid(Makale.MVCWebGrid.Veri.Urunler);
}

<div>
    @grid.GetHtml( 
        columns: grid.Columns(
                    grid.Column("Id", "Ürün Kodu"),
                    grid.Column("Ad", "Ürün Adı"),
                    grid.Column("Fiyat", "Fiyatı"), 
                    grid.Column("Adet", "Stok Miktarı")
                ))
 </div>

Asp.Net MVC WebGrid üzerinde verileri listeleme

Sayfa üzerine PDF’e aktarım işlemini tetikleyecek olan input > button kontrolünü ekleyelim. Kontrolün altına sonuçları üzerine ekleyeceğimiz bir div ekleyelim.

<input id="btPDFeAktar" type="button" value="PDF'e Aktar" />
<div id="sonuc"></div>

Butona tıklandığında bir iframe oluşturalım. iframe içerisinde, (birazdan oluşturacağımız) verileri PDF’e aktaracak olan View’ı (Home/PDFOlustur)  sonuc isimli div üzerinde görüntüleyeceğiz. Tetikleme işlemi için Jquery ile btPDFeAktar butonuna click olayını ekleyelim.

$(function () {
    $("#btPDFeAktar").on("click", function () {
        $('<iframe src="/Home/PDFOlustur"></iframe>').appendTo('#sonuc').hide();
    });
});

Şimdi HomeController içerisine PDFOlustur isimli Action’ı ekleyelim.

public ActionResult PDFOlustur()
{
    return View();
}

Oluşturduğumuz actionın View’ını ekleyelim : Views > Home > PDFOlustur.cshtml

PDFOlustur sayfası içerisinde PDF oluşturma işleminin kodları ve satır satır açıklamaları aşağıda yer almaktadır.

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

@{
    //Sayfanın çalıştırıldığında PDF dosyası gibi görünebilmesi için header'ını değiştiriyoruz.
    Response.AddHeader("Content-disposition", "attachment; filename=urunler.pdf");
    Response.ContentType = "application/octet-stream";

    var urunler = Makale.MVCWebGrid.Veri.Urunler;
        
    //Tablo sütunlarını tanımlamak için ilk satırı alıyoruz.
    var ilkSatir = urunler.FirstOrDefault();

    //PDF dosyası oluşturmak için Document türünden değişken tanımlıyoruz.
    var pdfDosyasi = new Document();
        
    //Dosya türünün PDF olacağını belirtiyoruz.
    PdfWriter.GetInstance(pdfDosyasi, Response.OutputStream);
        
    //Dosyanın sayfa boyutlarını belirtiyoruz (A4 boyutlarında olsuns)
    pdfDosyasi.SetPageSize(PageSize.A4.Rotate());
        
    //Dosyaya ekleme işlemi yapmak için açıyoruz.
    pdfDosyasi.Open();
        
        
    //Kayıtları listeleyeceğimiz tabloyu oluşturalım.
    var tablo = new PdfPTable(ilkSatir.GetType().GetProperties().Count())
    {
        //Tablonun genişliğini tanımlıyoruz.
        TotalWidth = 600
    };

    //Tablo içindeki yazı (ürün bilgisi) fontunu tanımlayalım
    var fontYazi = FontFactory.GetFont("Tahoma", 11, Color.BLACK);
        
    //Tablo içindeki başlık fontunu tanımlayalım.
    var fontBaslik = FontFactory.GetFont("Tahoma", 11, Font.BOLD, Color.BLACK);
    
    //Tablonun başlık satırını ilk satırın özelliklerini alarak oluşturalım.
    foreach (var ozellik in ilkSatir.GetType().GetProperties())
    {
        //Başlık satırına hücre ekleyelim. Hücrede özelliğin adı yazsın ve fontu fontBaslik olsun
        tablo.AddCell(new Phrase(ozellik.Name, fontBaslik));
    }
        
    //Tabloya ürün (kayıt) satırlarını tek tek ekleyelim.
    foreach(var urun in urunler)
    {
        //Tabloya ekleyeceğimiz satırın sütunlarını (özelliklerini) tek tek ekleyelim.
        foreach (var urunOzelligi in ilkSatir.GetType().GetProperties())
        {
            //Her satıra bir hücre ekliyoruz. Hücrede özelliğin değeri yazsın ve fontu fontYazi olsun
            tablo.AddCell(new Phrase(urunOzelligi.GetValue(urun, null).ToString(), fontYazi));
        }
    }
        
    //Tabloya başlık ve satır ekleme işlemlerini tamamladıktan sonra tabloyu pdfDosyasi'na ekleyelim
    pdfDosyasi.Add(tablo);
        
    //İşlemler tamamlandıktan sonra pdfDosyasi'nı kapatalım.
    pdfDosyasi.Close();
}

Projeyi çalıştırıp PDF’e aktar butonuna tıkladığınızda tarayıcının (header içinde tanımladığımız) urunler.pdf dosyasını indirmeye çalıştığını göreceksiniz.

Asp.Net MVC WebGrid ile verileri PDF'e aktarma

Asp.Net MVC ile PDF'e aktarılan veriler

 

Veysel Uğur KIZMAZ
Bilgisayar Mühendisi
veysel@ugurkizmaz.com
www.ugurkizmaz.com