C# PDF Oluşturma

Herkese merhaba, C# yazılarımıza kaldığımız yerden devam ediyoruz. Bu yazımızda PDF dosyası oluşturmayı anlatacağım. Hadi başlayalım !
PDF ismi, Portable Document Format yani Türkçe olarak Taşınabilir Dosya Biçimi ifadesinin kısaltmasından geliyor ve Adobe şirketi tarafından 1992’de geliştirildi. Şu anda belkide en çok kullanılan dosya türlerinden birisi. Fakat Adobe’un Acrobat gibi ücretli programları dışında doğrudan PDF dosyası oluşturma işlemi yapılamıyor. Microsoft Word gibi dosyalardan PDF’e çevrim yapılabiliyor fakat bu işlemlerde biraz zahmetli. Hele ki C# gibi bir programlama dili ile PDF dosyası oluşturmak istiyorsanız Word yazıp sonradan PDF’e çevirmek oldukça zahmetli olacaktır. Fakat doğrudan PDF dosyası oluşturabilen, dosyaya yazabilen, tablo-resim-grafik gibi grafiksel şeyler ekleyebilen kütüphanelerde var. Bunlardan bir tanesi ve benimde en çok kullandığım iTextSharp. Bu kütüphane ile PDF dosyası oluşturabilir, içerisine resim, tablo, grafik, paragraf gibi şeyler ekleyebilir, PDF dosyasının yazarını, açıklamasını gibi header olarak adlandırdığımız özelliklerini değiştirebilir ve dosyayı istediğiniz bir yere kaydedebilirsiniz. Aynı işlemleri var olan bir PDF dosyası üzerinde de yapabilirsiniz. Bu yazımda iTextSharp ile PDF dosyası oluşturmayı anlatacağım, diğer özellikleri zaman içerisinde yazacağım.
iTextSharp, C#’ın kurulumu ile beraber gelen kütüphanelerden 3. parti bir kütüphane, dolayısıyla projeye eklememiz gerekiyor. Bunun için Visual Studio üzerinden Package Manager Console’u açarak (Package Manager Console’u açmak için Visual Studio üzerinden Tools > NuGet Package Manager > Package Manager Console adımlarını izleyebilirsiniz)
install-package itextsharp
komutunu girmeniz yeterli olacaktır. Bu komutun ardından Nuget, iTextSharp paketini kendi sunucularından bulacak, indirecek ve projeye dahil edecektir. Ayrıca iTextSharp kütüphanesinin bağımlı olduğu paketleri de indireceği için ayrıca yapmamız gereken birşey yok. Paketi kurduktan sonra kod yazağımız sayfada bu paketi kullanacağımızı belirtmemiz gerekiyor. Bunun için sayfanın en başına gelerek;
using iTextSharp.text;
using iTextSharp.text.pdf;
kod satırlarını yazalım. Ardından PDF işlemlerini yapacağımız kod bloğu arasına geçebiliriz.
Öncelikle PDF işlemlerini yöneten sınıfın yeni bir nesnesini türetmemiz lazım. Bu sınıfın adı Document. Bu sınıf PDF dosyasının kendisi demek ve neredeyse her şey bunun üzerinden gidecek. Bu sınıfın constructor metodu 3 farklı kullanımı var. Bunlardan bir tanesi parametre almıyor. Bir tanesi 1 parametre alıyor ve bir tanesi de 5 parametre alıyor. Bu parametreler PDF dosyasının sayfa özelliklerini içeriyor. Örneğin 1 parametre alan kullanımında sayfanın boyutunu belirtiyoruz. Sayfanın boyutu olarakta A3, A4, A5, …, A10, ARCH_D gibi kağıt türleri olmakta. 5 parametre alan halinde 1. parametre yine kağıt boyutu, 2. parametre soldan boşluk, 3. parametre sağdan boşluk, 4. parametre üstten boşluk ve 5. parametre ise alttan boşluk için. Hiç parametre almayan kullanımında ise A4 kağıdına göre kendisi otomatik ayarlamakta. A4 kağıdına göre ayarlayacaksak parametre almayan halini kullanabiliriz. A4’ten farklı bir kağıt kullanacaksak 1 parametre alan halini, kağıdın kenarlarından özel boşluklar bırakacaksak da 5 parametreli halini kullanmamız gerekiyor. Kağıt boyutunu ayarlamak için PageSize sınıfı altındaki statik propertyleri kullanacağız. Örneğin biz A4 kağıdına göre kullanalım, bunun için 3 farklı kullanımını da kullanalım;
Document document = new Document(); // A4 kağıdına göre otomatik ayarlansın
Document document = new Document(PageSize.A4); // Kağıt A4 olsun, kağıt kenarlarındaki boşluklar otomatik ayarlansın
Document document = new Document(PageSize.A4, 25, 25, 30, 30); // Kağıt A4 olsun, kenar boşlukları da özel olsun
PDF dosyasını oluşturduk. Biz dosyaya yazma işlemi yapacağımız için bunu da belirtmemiz gerekiyor ve bu işlemi yapan sınıfın adı PdfWriter. Tabiki bu sınıfın da yeni bir nesnesini türetmemiz gerekiyor ve doğrudan bir constructor metoda sahip değil. Bunun yerine sınıf altında bulunan GetInstance() adındaki statik bir fonksiyon ile nesne türetme işlemi yapılıyor. Bu fonksiyon ise Document nesnesi ve FileStream nesnesi olmak üzere 2 tane parametre alıyor. Document nesnesini az önce türettik fakat FileStream nesnesini türetmedik. FileStream sınıfı System.IO kütüphanesi altında bulunan bir sınıf ve doğrudan constructor metodunu kullanarak yeni bir nesnesi türetilebiliyor. Constructor metodu ise string tipte dosya yolu, dosyaya yapılacak işlem ve dosyaya erişim metodu olmak üzere 3 tane parametre alıyor. Dosya yolu, PDF dosyasının yolu olacak. Dosyaya yapılacak işlem FileMode nesnesi, dosyaya erişim metodu ise FileAccess nesnesi olacaktır. Biz dosyayı açıp içerisine veri yazacağımız için FileMode olarak OpenOrCreate, FileAccess olarak Write vermemiz gerekiyor. Bu sayede C#, dosyayı yazma modunda açacaktır. Öncelikle FileStream nesnesi ve sonrasında PdfWriter nesnesi oluşturalım;
FileStream fs = new FileStream("dosya.pdf", FileMode.OpenOrCreate, FileAccess.Write);
PdfWriter writer = PdfWriter.GetInstance(document, fs);
Dosyayı C# tarafında FileStream nesnesine bağladık fakat henüz açmadık. Açma işlemini iTextSharp kütüphanesi ile yapacağız ve bu işlemi document nesnesi altındaki Open() fonksiyonu yapmakta. Bu fonksiyon herhangi bir parametre istemiyor ve dosyaya yazmak için açıyor. Yani kullanımı şöyle;
document.Open();
Evet tüm hazırlıklarımız tamam, artık dosyaya veri yazabiliriz. Örneğin biz SoftwareSup.Net yazalım. PDF dosyalarında doğrudan bir yazı yazmak dosyaya paragraf eklemek demek olduğundan dosyaya paragraf ekleyeceğiz. iTextSharp kütüphanesinde dosyaya herhangi bir şey yazmak için document nesnesi altındaki Add() fonksiyonu kullanılıyor ve bu fonksiyon dosyaya yazılacak nesneyi parametre olarak istiyor. Biz paragraf ekleyeceğimiz için iTextSharp kütüphanesinde bu işlemi Paragraph sınıfı yapmakta ve bu sınıfın constructor metodu kullanılarak yeni bir nesnesinin türetilmesi gerekiyor. Constructor metodu ise string tipte paragrafın içeriğini parametre olarak istiyor. Biz SoftwareSup.Net yazacağımız için parametreyi bu şekilde göndereceğiz.
document.Add(new Paragraph("SoftwareSup.Net"));
Evet dosyaya paragraf ekledik ve işimiz bitti. Artık açtığımız her şeyi kapatmamız gerekiyor. Yani biz PdfWriter, FileStream ve Document nesnelerini açtığımız için bunları kapatmamız gerekiyor. Bu nesneleri kapatmak için her birinin Close() fonksiyonunu kullanacağız.
document.Close();
writer.Close();
fs.Close();
Evet kodları yazıp çalıştırdığınızda ve PDF dosyasını açtığınızda şöyle bir ekran göreceksiniz;

Tüm işlemlerimiz tamamlandı, yazdığımız kodları daha düzenli olması için aşağıya bırakıyorum;
Document document = new Document();
FileStream fs = new FileStream("dosya.pdf", FileMode.OpenOrCreate, FileAccess.Write);
PdfWriter writer = PdfWriter.GetInstance(document, fs);
document.Open();
document.Add(new Paragraph("SoftwareSup.Net"));
document.Close();
writer.Close();
fs.Close();
Tüm C# yazılarımıza buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.