iTextSharp PDF Dosyasına Tablo Ekleme

Herkese merhaba, C# yazılarımıza kaldığımız yerden devam ediyoruz. Bu yazımızda iTextSharp kütüphanesini kullanarak PDF dosyasına tablo eklemeyi anlatacağım. Hadi başlayalım !
Öncelikle bir tane proje oluşturup açalım. iTextSharp kütüphanesi C# kurulumu ile beraber gelen kütüphanelerden olmayıp 3. parti bir kütüphane olduğu için öncelikle bu paketi projemize dahil etmemiz gerekiyor. Bunun en kısa yolu Nuget kullanmak. Nuget ile gerek C#’ın kendi paketlerini, gerekse 3. parti paketleri tek bir komut ile projemize dahil edebiliyoruz. Nuget, Visual Studio üzerinde terminale entegre bir şekilde çalışan bir paket yöneticisi. Visual Studio üzerinden Nuget konsolunu Visual Studio üzerinden Tools > NuGet Package Manager > Package Manager Console adımlarını izleyerek açabilirsiniz. Sonrasında iTextSharp paketini projeye eklemek için şöyle bir komut gireceğiz;
install-package itextsharp
Bu komutun ardından Nuget, iTextSharp paketini indirecek ve projeye dahil edecektir.
Paketi kurduktan sonra kod yazacağımız dosyaya gelelim. Paketi kurmuş olsakta kod yazacağımız dosyada da paketi çağırmamız gerekiyor. Bunun için sayfanın en başına gelerek şu kodları ekleyelim;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
Bunları da ekledikten sonra artık iTextSharp paketini kullanmaya başlayabiliriz.
PDF dosyasına tablo ekleyebilmek için öncelikle PDF dosyasını belirteceğiz, dosyayı açacağız, tablo oluşturacağız, tabloya hücreler ekleyeceğiz, tabloyu dosyaya ekleyeceğiz, dosyayı kaydedip kapatacağız. PDF dosyasını belirlemek için Document adında bir sınıf kullanılıyor. Bu sınıf PDF dosyasını temsil ediyor ve kullanabilmek için yeni bir nesnesini türetmemiz gerekiyor. Nesne türetmek için constructor fonksiyonunu kullanacağız ve bu fonksiyon parametre almadan çalışmakta. Yani şöyle yeni bir Document sınıfı nesnesi oluşturalım;
Document pdfDosyasi = new Document();
Dosyayı tutan nesneyi türettik. Şimdi sıra geldi dosyayı tanımlamaya. Bunun için PdfWriter sınıfı kullanılıyor ve bu sınıftan da yeni bir nesnenin türetilmesi gerekiyor, fakat bu sınıf constructor metoda sahip değil. Bunun yerine altında bulunan static tipteki GetInstance() fonksiyonu kullanılarak yeni bir nesnesinin türetilmesi sağlanıyor. GetInstance() fonksiyonu ise Document sınıfı nesnesi ve FileStream sınıfı nesnesi olmak üzere 2 tane parametre istiyor. Document sınıfından yeni bir nesne türettik, şimdi FileStream sınıfına geçelim.
FileStream sınıfı System.IO kütüphanesi altında bulunan bir sınıf ve bilgisayarınızdaki dosyalar üzerinde işlem yapabilmenizi sağlıyor. Bu sınıfı kullanabilmek için de yeni bir nesnesinin türetilmesi gerekiyor. Yeni bir nesnesi constructor metodu kullanılarak yapılıyor ve constructor metod string tipte dosya yolu, dosyaya erişim modu ve dosyaya yapılacak işlem olmak üzere 3 tane parametre alıyor. Dosyaya erişim modu FileMode türünde, dosyaya yapılacak işlem ise FileAccess türünde olması gerekiyor. Dosyaya veri yazabilmek için FileAccess nesnesinin Write olması gerekiyor. FileMode olarakta Open yada OpenOrCreate kullanabiliriz. Open, var olan bir dosya üzerinde işlem yapmayı sağlıyor. OpenOrCreate ise dosya varsa direk açıyor, yoksa oluşturuyor ve açıyor. Open kullanırsak ve dosya belirttiğimiz yolda yoksa hata verir, OpenOrCreate dosyayı oluşturur ve hatasız bir şekilde açar. Dolayısıyla OpenOrCreate kullanmamız daha mantıklı olacaktır. Dosya yoksa otomatik olarak oluşturulacak ve hata vermeden açılacaktır. Yani FileStream sınıfından yeni bir nesneyi şu şekilde oluşturabiliriz;
FileStream fs = new FileStream("dosya.pdf", FileMode.OpenOrCreate, FileAccess.Write);
FileStream nesnesi oluşturduğumuza göre PdfWriter sınıfından da yeni bir nesne türetebiliriz.
PdfWriter writer = PdfWriter.GetInstance(pdfDosyasi, fs);
Bu ana kadar PDF dosyasını belirledik ve FileStream’a bağladık fakat FileStream’a bağlamamız dosyanın açıldığı anlamına gelmez, dosya henüz açılmadı. Dosyayı iTextSharp tarafında açmamız gerekiyor, çünkü iTextSharp ile çalışacağız 🙂 Dosyayı Document nesnesinde tutuyorduk ya, bu nesne altındaki Open() fonksiyonunu kullanarak dosyayı açabiliyoruz ve bu fonksiyon herhangi bir parametre istemiyor.
pdfDosyasi.Open();
Dosyayı da açtığımıza göre bir sonraki adım olan tablo oluşturma aşamasına geçebiliriz. Tabloyu PdfPTable adındaki bir sınıf ile oluşturabiliyoruz. Tabiki bu sınıfı kullanabilmek için yeni bir nesnesini türetmemiz gerekiyor. Yeni bir nesnesini constructor metodunu kullanarak oluşturabiliriz ve constructor fonksiyon integer tipte bir tane parametre istiyor. Bu parametre tablodaki sütun sayısını ifade ediyor. Yani 1 sütunlu bir tablo oluşturacaksak 1, 2 sütunlu bir tablo oluşturacaksak 2 parametresini göndermemiz gerekiyor. Ben 2 sütunlu bir örnek yapacağım, buna göre PdfPTable nesnesi oluşturalım;
PdfPTable tablo = new PdfPTable(2);
2 sütunu olan bir tablo oluşturduk fakat tablo şu anda boş, herhangi bir veri yazmadık. Tabloya satır ve sütun eklenemiyor, bunun yerine hücre ekleyerek ilerliyoruz. Tabloya hücre eklemek için de PdfPTable nesnesi altındaki AddCell() fonksiyonunu kullanıyoruz. Bu fonksiyon bir tane parametre istiyor ve bu parametrenin resim yada string metin olması gerekiyor. Resim ekleme tıpkı PDF dosyasına resim ekleme işlemi gibi yapılıyor. Yani öncelikle Image sınıfından yeni bir nesne türetilmesi gerekiyor. Bu sınıfın constructor metodu kullanılarak yeni bir nesnesi türetilemiyor, bunun yerine altında bulunan static tipteki GetInstance() metodu kullanılıyor. Bu fonksiyona string tipte dosya yolunu parametre olarak göndermemiz gerekiyor. Örneğin masaüstünde bir tane resim olduğunu varsayalım ve bu resim için Image nesnesi türetelim;
Image image = Image.GetInstance("c:/users/kullanici/desktop/resim.png");
AddCell() fonksiyonuna string tipte yazı gönderdiğimiz zamanda gönderdiğimiz yazıyı doğrudan hücreye yazıyor ve kaydediyor. Örneğin hücreye SoftwareSup.Net yazalım, ayrıca az önce oluşturduğumuz resmi de ekleyelim.
table.AddCell(image); table.AddCell("SoftwareSup.Net");
Evet tabloya hücre olarak hem resim hemde yazı yazdık. Biz 2 sütunlu bir tablo oluşturduk ve 2 tane hücre ekledik, bu normal kullanım. Fakat dikkat etmemiz gereken nokta şu; ekleyeceğimiz hücre sayısı PdfPTable sınıfı nesnesi oluştururken parametre olarak gönderdiğimiz sütun sayısının tam katı olmalı. Yani PdfPTable nesnesi oluştururken 2 sütun oluştur dedik ya, table.AddCell() fonksiyonunu da 2 ve 2’nin katı olacak kadar çağırmamız gerekiyor. Ben 2 sütunlu tablo oluşturayım ama 3 hücre ekleyeyim derseniz hata alırsınız. table.AddCell() fonksiyonunu her çağırdığımızda iTextSharp, parametre olarak gönderdiğimiz veriyi bir sonraki hücreye ekliyor. Sütun sayısı ile veri eklenen hücre sayısı eşit olduğunda bir sonraki satıra geçiyor. Yani bir üstte yaptığımız resim ve SoftwareSup.Net yazılarını ekleme kodlarını çoğaltarak satır sayısını arttırabiliriz.
Tablo içerisine veri ekledik fakat tabloyu PDF dosyasına eklemedik. Eklemek için Document nesnesi altındaki Add() fonksiyonunu kullanacağız. Bu fonksiyona PdfPTable nesnesini parametre olarak gönderdiğimizde tablomuz dosyaya eklenmiş olacaktır. Hadi yapalım;
pdfDosyasi.Add(table);
Dosya içerisine veri eklemesini tamamladık, artık dosya ile işimiz kalmadı. İşimiz bittiği için dosyayı kapatmamız gerekiyor. Dosya kapattığımızda içerisine eklemiş oldumuz veriler dosyaya yazılıp kaydedilecek ve bellekten serbest bırakılacaktır. Fakat sadece dosyayı değil, PdfWriter ve FileStream nesnelerini de kapatarak bellekte serbest bırakmamız gerekiyor. FileStream nesnesini kapatmadığımız takdirde dosya serbest bırakılmayacak ve aynı dosya ile başka bir işlem yaptığımızda (aynı kodu tekrar çalıştırmak yada dosya yöneticisi üzerinden elle açma) dosyanın başka bir proses tarafından kullanıldığını, bu yüzden erişilemediğini söyleyecek ve hata verecektir. Bunu önlemek için dosyayı tamamen serbest bırakalım. Document, PdfWriter ve FileStream nesnelerini kapatmak ve bellekte serbest bırakmak için her birinin ayrı ayrı Close() fonksiyonlarını çağıracağız. Bu fonksiyonlar parametre istemiyor ve ilgili nesneyi kapatıyor.
pdfDosyasi.Close();
writer.Close();
fs.Close();
Evet tüm işlemlerimiz tamamlandı, artık kodu çalıştırabiliriz. Kodu çalıştırıp oluşturulan PDF dosyasını açtığınızda şöyle bir dosya göreceksiniz;

Görüldüğü üzere PDF dosyası içerisine tablo eklemesini yapmış bulunuyoruz. Yazdığımız tüm kodları daha toplu olması için aşağıya bırakıyorum;
Document pdfDosyasi = new Document();
FileStream fs = new FileStream("dosya.pdf", FileMode.OpenOrCreate, FileAccess.Write);
PdfWriter writer = new PdfWriter(pdfDosyasi, fs);
pdfDosyasi.Open();
PdfPTable tablo = new PdfPTable(2);
Image image = Image.GetInstance("c:/users/kullanici/desktop/resim.png");
table.AddCell(image);
table.AddCell("SoftwareSup.Net");
pdfDosyasi.Add(table);
pdfDosyasi.Close();
writer.Close();
fs.Close();
Tüm C# yazılarımıza buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.