PHP ile PDF dosyası oluşturma işlemi bir kaç adımdan oluşuyor. Öncelikle kullanışlı, esnek ve detaylı bir kütüphane bulmak, ardından kütüphanenin nasıl kullanıldığını öğrenmek, daha sonra gerçek projeyi yapmadan önce küçük bir deneme programı yazmak, deneme programı başarılı olduktan sonra asıl işi yapmaya başlamak. Aslında bu anlattığım adımlar sadece bu işlem için geçerli değil, deneyimli bir yazılımcı bu iş akışını her projesinde uygular. Öyleyse adımları tek tek yapalım.
Google’ da bir araştırma yaptım, tüm PHP-PDF kütüphanelerinin özelliklerini ve örneklerini inceledim. Sonunda aradığım PHP kütüphanesinin TCPDF olduğuna karar verdim. TCPDF’ in sayfasına bağlandım.
Sayfadaki download linkinden son versiyonunu bilgisayarıma indirdim. Zipli dosyayı root dizinimin altına açtım. Apache-PHP paketi olarak Zend’i kullanıyorum, dolayısıyla benim root dizinimin altında bulunan TCPDF yolu tam olarak şöyle oldu:
C:/Program Files/Zend/Apache2/htdocs/www/tcpdf
Sonra ilk küçük deneme programını yazmaya başladım. ex1.php, diğer tüm programlarım gibi root dizininin altında bulunuyor.
ex1.php
// öncelikle tcpdf klasörü içindeki iki dosyayı include etmem gerekiyor.
require_once(‘tcpdf/config/lang/eng.php’);
require_once(‘tcpdf/tcpdf.php’);
// yeni bir pdf objesi oluşturuyorum.
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, ‘utf-8′, false);
/* Dökümanımın özelliklerini belirtiyorum. Dosyam oluştuğu zaman mouse ile üzerine geldiğimde bu özellikler küçük bir kutucuğun içinde yazacak. */
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor(‘Duygu Colak’);
$pdf->SetTitle(‘Example PDF’);
// header’ı ve footer’ı ayarlıyorum. Ben header veya footer göstermek istemiyorum. Dolayısıyla “false” olarak çağırıyorum aşağıdaki iki fonksiyonu.
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
// Bazı statik ayarlamaları da TCPDF’ in sayfasındaki örneklerde gördüğüm şekilde yapıyorum. */
// set default monospaced font
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
//set margins
//$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
//set auto page breaks
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
//set image scale factor
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
//set some language-dependent strings
$pdf->setLanguageArray($l);
/* PDF dosyamdaki yazıların font özelliğini ayarlıyorum. tcpdf klasörümün içinde fonts klasörü var. Bu klasörün içinde tanımlı fontlardan “times” ı kullanacağım ve textlerimin italic olmasını istiyorum. O yüzden SetFont fonksiyonumun ilk parametresi “times” ikincisi “i”. */
$pdf->SetFont(‘times’, ‘i’, 10);
// Bir sayfa ekliyorum.
$pdf->AddPage();
// Ekrana yazdıracağım textleri $html isimli değişkenin içine atıyorum. İstersem html tagleri de kullanabilirim.*/
$html = “Hello World. This is my new PDF file which I created using PHP.”;
// Değişkenimin çıktısını üretiyorum.
$pdf->writeHTML($html, true, false, true, false, ”);
// PDF dosyamı oluşturuyorum.
$pdf->Output(‘Example.pdf’, ‘F’);
ex1.php yi tarayıcımdan çağırdığım zaman, ex1.php ile aynı yolda Example.pdf isimli bir dosya oluşacak. İlk deneme programımın çıktısı hazır. Buraya kadar herşey tamam.
ex2.php
ex1.php’ yi Save As ile ex2.php olarak kaydedelim. “Hello World” diye başladığımız, pdf dosyamızın içindeki text i Türkçeleştirelim. “Merhaba Dünya. Bu PHP ile hazırladığım ilk PDF dosyam.” yazalım ve kodun son satırındaki Output fonksiyonuyla oluşturduğumuz dosyanın adını Example2.pdf olarak değiştirelim, aksi takdirde eski dosyamızın üstüne yazılacak. Ve bu kez ex2.php yi tarayıcımızdan çağıralım. Çıktıya bakarsak bomboş bir dosya göreceğiz. Bunun iki nedeni var, birincisi TCPDF’ in sayfasında da dediği gibi, “times” fontunun Windows’ un altındaki “Times New Roman” fontuyla bir alakası yok, yani Türkçe karakterleri desteklemiyor. TCPDF’ in yazarının forumlardaki aynı tarz dil sorunlarına, önerdiği font “dejavusans”. Öyleyse biz de fontumuzu değiştirelim.
ex3.php
// ex2.php deki iki satırı değiştiriyorum.
$pdf->SetFont(‘dejavusans’, ”, 10);
$pdf->Output(‘Example3.pdf’, ‘F’);
Kaydettim ve tarayıcımdan ex3.php yi çağırdım. Example3.pdf yine boş. Çünkü forumlarda cevaplanmayan bir durumla karşı karşıyayız. Dosyamız ANSI kodlaması ile kayıt edildi . Oysaki biz PDF objemizi yaratırken ‘UTF-8′ kullanacağımızı söylemiştik. Öyleyse editörümüzden dosyamızın kodlamasını değiştirelim.
ex4.php
Editör olarak PSPad kullanıyorum. PSPad’ de ‘Biçim’ menüsünden UTF-8′i seçip dosyamı bu şekilde Save As ile ex4.php olarak kaydettim. Siz farklı bir editör kullanıyorsanız ve editörünüzde bu değişikliği yapmanın bir yolu yoksa, ex3.php yi kapatın, notepadle tekrar açın, File/Save As seçeneğini tıkladıktan sonra, adını ve kodlamasını(encoding) sırasıyla ex4.php ve UTF-8 olarak değiştirin. ex4.php yi tarayıcınızdan çağırın. Example4.pdf dosyasında herşey düzgün görünüyor, yalnız Türkçe karakterlerin hepsini test etmemizde fayda var.
ex5.php
// Türkçe karakterleri test edelim. Biraz da html tag i ekleyelim.
$html = “Merhaba Dünya. <br />Bu PHP ile hazırladığım ilk PDF dosyam.<u>ÖÇĞÜŞİöçğüşı</u>”;
// Dosyanın adını da değiştirmeyi unutmuyorum.
$pdf->Output(‘Example5.pdf’, ‘F’);
Example5.pdf de herşey düzgün görünüyor. Türkçe karakterlerde sorun yok ve üstelik html tagleri de düzgün çalışıyor.
Peki diyelimki sizin sisteminizdeki tüm programlar ansi kodlaması ile yazılmış ve pdf dosyasını oluşturduğunuz programınızı da başka bir programdan çağırıyorsunuz ve tabii ki pdf dosyasını oluşturduktan sonra kullanıcıyı başka bir sayfaya yönlendiriyorsunuz ki onun da kodlaması ansi. Böyle bir durumda ex5.php yi UTF-8 kodlaması ile kaydederseniz, kullanıcıyı yönlendirdiğiniz sayfa da Türkçe karakterler bozuk görünecektir. Dolayısıyla son örneği kodlaması ansi olacak şekilde ex6.php ismiyle kaydetmek zorundasınız. Bu durumda Türkçe karakterleri düzgün bir şekilde göstermeye çalışalım.
ex6.php
/* Bunu yapmanın tek yolu yazacağımız tüm Türkçe karakterleri PHP’ nin iconv fonksiyonu yardımıyla UTF-8 e çevirmek.*/
$html = iconv(“windows-1254″, “UTF-8″,”Merhaba Dünya. <br />Bu PHP ile hazırladığım ilk PDF dosyam.<u>ÖÇĞÜŞİöçğüşı</u>”);
Hem ex6.php dosyanız ansi kodlamasıyla oluşturuldu hem de Example6.pdf dosyanız Türkçe karakterleri düzgün gösteriyor.
Önemli Not: Bu adımlardan sonra gerçek projeyi yapmaya başladığımda, projemde daha önce kullandığım ve inline olarak yazılmış css kodlarının “font-family:arial, tahoma”, Türkçe karakterleri pdf dosyamda bozduğunu farkettim çünkü tcpdf dizninde arial ve tahoma fontları yoktu. tcpdf.org’ da fontname.php dosyalarının nasıl yaratılacağı anlatılıyor. Bu zaman alıcı işlemlerle uğraşmak yerine ve dejavusans fontu işimi gördüğünden, dejavusans.php dosyasını copy/paste ile arial.php ve tahoma.php olarak fonts dizinine kaydettim. Bu problem de böylelikle aşılmış oldu.
