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.
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>
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.
Veysel Uğur KIZMAZ
Bilgisayar Mühendisi
veysel@ugurkizmaz.com
www.ugurkizmaz.com