iTextSharp PDF Dosyasına Resim Ekleme

Herkese merhaba, C# yazılarımıza kaldığımız yerden devam ediyoruz. Bu yazımızda iTextSharp kütüphanesi ile PDF dosyasına resim eklemeyi anlatacağım. Hadi başlayalım !
iTextSharp, C# ve Java için geliştirilmiş PDF kütüphanesi ve bu kütüphane ile PDF dosyaları üzerinde birçok işlem yapılabilmekte. Yazımızın başlığı resim ekleme olduğu için resimde eklenebiliyor 🙂
Öncelikle bir tane C# projesi oluşturalım ve iTextSharp kütüphanesini projemize ekleyelim. iTextSharp kütüphanesi C# kurulumu ile beraber gelen kütüphanelerden olmayıp 3. parti bir kütüphane olduğu için elle indirip projeye eklememiz gerekiyor. Kütüphane Nuget’te de bulunduğundan Nuget’i kullanarak projemize eklemesini yapabiliriz. Visual Studio üzerinden Tools > Nuget Package Manager > Package Manager Console adımlarını izleyerek Nuget terminalini açalım ve şu komutu girelim;
install-package itextsharp
Bu komutun ardından Nuget, iTextSharp kütüphanesini indirecek ve projemize dahil edecektir. Kütüphaneyi indirdikten sonra kod yazacağımız dosyada bu kütüphaneyi kullanacağımızı belirtmemiz gerekiyor. Bunun için sayfanın en başına gelerek
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
kodlarını ekleyelim. Artık iTextSharp kütüphanesini kullanarak PDF işlemleri yapabiliriz.
Öncelikle PDF dosyasını temsil eden sınıftan yani Document sınıfından yeni bir nesne türetmemiz gerekiyor. Bu sınıfın constructor metodu ile yeni nesnesi türetilebiliyor ve 3 farklı kullanımı mevcut. Birinci kullanımında hiç parametre istemiyor. İkinci kullanımında 1 tane, üçüncü kullanımında ise 5 tane parametre istiyor. 1 parametre isteyen kullanımında parametre olarak kağıt ölçülerini istiyor. 5 parametreli kullanımında ise ilk parametre kağıt boyutu, ikinci parametre sağdan boşluğu, üçüncü parametre soldan boşluğu, dördüncü parametre üstten boşluğu ve beşinci parametre ise alttan boşluğu temsil ediyor. Hiç parametre istemeyen kullanımında ise A4 kağıdının ölçülerini baz alıyor. Yani siz A4 kağıdına göre işlem yapacaksanız parametre almayan halini, A4’ten farklı bir kağıt kullanacaksanız 1 parametreli halini, hem A4’ten farklı bir kağıt kullanacaksınız hemde kağıdın kenarlarında bırakılacak boşluğun A4’ten farklı olmasını istiyorsanız 5 parametreli halini kullanacaksınız. A4 kağıdını kullanacak ama kenar boşluklarını özel yapmak istiyorsanız yine 5 parametreli halini kullanmanız gerekiyor. Ben parametre istemeyen halini yani ön tanımlı A4 ayarlarında kullanacağım. Buna göre yeni bir Document nesnesi türetelim.
Document document = new Document();
PDF dosyasını belirledik, şimdi dosyaya yazma işlemini yapan sınıfa, yani PdfWriter sınıfına. Bu sınıfı constructor metodunu kullanarak yeni bir nesnesi türetilmiyor. Bunun yerine static tipte bulunan GetInstance() fonksiyonunu kullanmamız gerekiyor. Bu fonksiyon Document nesnesi ve FileStream nesnesi olmak üzere 2 tane parametre istiyor. Document nesnesi oluşturduk fakat FileStream nesnesini türetmedik, öncelikle onu halledelim.
FileStream, System.IO kütüphanesi altında bulunan bir sınıf, yani iTextSharp ile ilgisi yok fakat PdfWriter sınıfı bu sınıfa bağımlı çalışıyor. Bir dosyaya veri yazabilmek için öncelikle o dosyayı açmak gerekiyor ve C#’ta dosya açma işlemini FileStream sınıfı yapıyor. FileStream sınıfının yeni bir nesnesini türeten constructor metodu string tipte dosya yolu, dosya modu ve dosya erişim tipi olmak üzere 3 tane parametre istiyor. Dosya modu olarak FileMode nesnesi, erişim tipi olarakta FileAccess nesnesi istiyor. Biz dosyayı yazmak için açacağımız için FileAccess değerimiz Write olacak. Dosyayı açabilmek için FileMode altında Open yada OpenOrCreate kullanabiliriz. Open; var olan bir dosyayı açar, OpenOrCreate ise dosya var ise açar, yoksa oluşturur ve açar. Dosyayı elle oluşturmak yerine doğrudan OpenOrCreate kullanarak dosya yoksa oluşturulmasını da sağlayabiliriz. Şimdi öncelikle FileStream, sonrasında da PdfWriter nesnesi türetelim;
FileStream fs = new FileStream("dosya.pdf", FileMode.OpenOrCreate, FileAccess.Write);
PdfWriter writer = new PdfWriter(document, fs);
Dosyayı FileStream nesnesine bağladık fakat henüz açmadık. Açmak için document nesnesi altındaki Open() fonksiyonunu kullanacağız. Bu fonksiyon herhangi bir parametre istemeden dosyayı açıp yazmaya hazır hale getiriyor.
document.Open();
Şimdi sıra geldi PDF dosyasına resim eklemeye. Resim ekleyebilmek için öncelikle ekleyeceğimiz resmi belirlememiz gerekiyor. Yani iTextSharp kütüphanesinde Image sınıfından yeni bir nesne türetmeli ve dosyaya ekleyeceğimiz resim dosyasını belirtmeliyiz. Image sınıfının tıpkı PdfWriter sınıfı gibi constructor metod yerine GetInstance() static fonksiyonu kullanılarak yeni bir nesnesi türetiliyor. Bu metod string tipte bir tane parametre istiyor ve bu parametre resim dosyasının yolunu ifade ediyor. Örneğin ben aşağıdaki resmi PDF dosyasına ekleyeceğim.

Bu resmi sizde indirip masaüstünüze kaydedebilir ve aşağıdaki kod ile Image sınıfından yeni bir nesne türetebilirsiniz.
Image image = Image.GetInstance("c:/users/kullanici/desktop/book.png");
Şimdi sıra resmi dosyaya eklemeye geldi. Bunun için document nesnesi altındaki Add() fonksiyonunu kullanacağız. Bu fonksiyona az önce oluşturduğumuz Image nesnesini parametre olarak vereceğiz ve bu sayede resmimizi PDF dosyasına ekleyeceğiz.
document.Add(image);
Resmi PDF dosyasına ekledik fakat Document, PdfWriter ve FileStream nesneleri bellekte açık kaldı. Bu nesneleri kapatarak dosyanın serbest bırakılmasını sağlayarak dosyanın son halinin kaydedilmesini sağlamamız gerekiyor. Kapatmadığımız takdirde bu nesneler dosyaya bağlı kalıyor ve dosyayı elle açmak istediğimizde başka bir işlem tarafından bu dosyanın kullanıldığını söyleyecek ve readonly yani sadece okuma modunda açmak isteyip istemediğimizi soracaktır. Ayrıca bu dosya üzerinde C# ile bir başka işlem yapmak istediğimizde dosya kullanıldığından hata verecektir. Bunları önlemek için bu nesneleri kapatalım. Kapatma işlemi için her birinin altındaki Close() fonksiyonlarını kullanacağız. Bu fonksiyonlar parametre istemiyor.
document.Close();
writer.Close();
fs.Close();
Bu kodları yazıp çalıştırdığınızda belirlediğiniz yolda bir tane PDF dosyası oluşturulacak ve bu dosyanın içeriği şöyle olacaktır;

Gördüğünüz üzere resim taşma yapmış. Çünkü resmi doğrudan orijinal boyutlarında ekledik. Resmi yeniden boyutlandırma işlemi de yapılabilmekte ve bu işlem 2 farklı şekilde yapılabilmekte. Birincisi doğrudan resmin boyutlarını elle vermek, ikincisi resmin orijinal boyutuna göre yüzdelik olarak boyutlandırmak. Birinci yöntemde resmin boyutları ne olursa olsun (100, 100) boyutuna getir diyebiliyorken; ikinci yöntemde ise resmin orijinal boyutunun %50’si kadar küçült diyebiliriz. Birinci yöntemdekini kullanmak için image nesnesi altındaki ScaleToFit() fonksiyonu, ikinci yöntemdekini kullanmak için image nesnesi altındaki ScalePercent() fonksiyonunu kullanmamız gerekiyor. Her iki fonksiyonda float tipte 2 tane parametre istiyor ve birinci parametre genişlik, ikincisi ise yüksekliği ifade ediyor. Örneğin resmi (100, 100) boyutlarına getirme ve %50 oranında küçültme için şöyle kod yazmamız gerekiyor;
image.ScalePercent(50, 50); // Resim hem yükseklik hemde genişlikten %50 oranında küçültülecektir
image.ScaleToFit(100, 100); // Resmin yükseklik ve genişliği 100 piksel olarak ayarlanacaktır
Her iki kullanımda da resmin orijinali üzerinde bir değişiklik yapılmaz, resmin bir kopyası alınır, onun üzerinde işlem yapılır ve kopya resim PDF dosyasına eklenir. Birinci kullanımda resim kesme değil boyutlandırma işlemi yapılır. Yani resmin boyutları küçültülür fakat resim üzerinde değişiklik yapılmaz.
Evet iTextSharp ile PDF dosyasına resim ekleme işlemi bu kadardı, yazdığımız tüm kodları toplu 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);
writer.CompressionLevel = PdfStream.BEST_COMPRESSION;
document.Open();
Image image = Image.GetInstance("c:/users/seyitd/desktop/book.png");
image.ScalePercent(50, 50);
image.ScaleToFit(100, 100);
document.Add(image);
document.Close();
writer.Close();
fs.Close();
Tüm C# yazılarımıza buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.