Friday, February 18th, 2011 | Author: Duygu

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.

http://www.tcpdf.org/

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.

Category: php  | Tags: ,  | Leave a Comment
Tuesday, November 02nd, 2010 | Author: Duygu

Today I want to mention about ajax by giving you the link of most successful site about it. Following the steps in the site, you can convert your html page to an ajax site in a few minutes or if you are creating a new site, you can also use the technics that is described. Here is the link:

Conv2Ajax

Category: HTML  | Tags: ,  | Leave a Comment
Tuesday, May 25th, 2010 | Author: Duygu

You don’t like to show your users a  standard and simple http error pages. OK Then let’s see how to manage to send the users to a different page, and create your custom error pages.

  1. In httpd.conf file,
    <Directory /var/www/>
    AllowOverride None
    Order allow,deny
    allow from all
    </Directory>

    to

    <Directory /var/www/>
    AllowOverride All
    Order allow,deny
    allow from all
    </Directory>

  2. Create .htaccess file, unless you do have one. It’s very simple to create a .htaccess file. Open some text editor and save the blank file name as .htaccess. Do not use any extension for the file name, just .htaccess. And don’t forget to put a dot before the file name.
    Write the page url in it, where you will redirect the user to:
    ErrorDocument 404 /404page.html
    or you can just give a message:
    ErrorDocument 404 “The page you are looking is no longer exists.”
  3. Create a html file with the name you given in the .htaccess. So for our example we will create 404page.html in root directory.
  4. Call a page, that does not in your root directory.

! And don’t forget to restart your apache server, after you do some changes in apache’s configuration file httpd.conf.

You can extend this example for any other http errors. Use just one .htaccess file per directory.

Category: php  | Tags: , ,  | Leave a Comment
Friday, May 21st, 2010 | Author: Duygu

You have two date fields, one is for start date and another one is for end date.  You want to compare and ensure that date fields are in the correct order, like start date is before end date and other way around.

HTML Code:

<html>
<head>
</head>
<body>
<div>
Start Date :<input type=”text” name=”str_date” id=”str_date” size=”10″ value=”" onchange=”controlDate(this.id, ‘end_date’);” />
End Date :<input type=”text” name=”end_date” id=”end_date” size=”10″ value=”" onchange=”controlDate(this.id, ‘str_date’);” />
</div>
</body>
</html>

You see, we add onchange javascript function to fields. And add below javascript code in the head of your page.

Javascript Code:

<script>
function controlDate(objId, dateId){
str_first_date = document.getElementById(objId).value;
str_second_date = document.getElementById(dateId).value;
first_date = conv_to_date(str_first_date);
second_date = conv_to_date(str_second_date);
if(objId == “str_date” && second_date != “”)
{
if(first_date > second_date)
{
alert(“Start date must be before end date!”);
document.getElementById(objId).value = “”;
return false;
}

}
if(objId == “end_date” && second_date != “”)
{
if(first_date < second_date)
{
alert(“End date must be after start date!”);
document.getElementById(objId).value = “”;
return false;
}

}
}

function conv_to_date(date_val)
{

var startYear = parseInt(date_val.substr(6,4), 10);
var startMonth = parseInt(date_val.substr(3,2), 10) – 1; // as per Residuum’s comment
var startDay = parseInt(date_val.substr(0,2), 10);
var dt = new Date(startYear, startMonth, startDay);
return dt;
}
</script>

Category: Javascript  | Leave a Comment
Monday, May 03rd, 2010 | Author: Duygu

If you’re using templates in your project, you may want to use one template more than once. But what if you want to show some elements in one programme and hide these elements in second one. You constantly, write your ordinary two line of javascript code in the head of your html code. That’s where the problem occurs.

For example, you write the code below and run it in your browser,

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<html>
<head>
<meta http-equiv=”content-type” content=”text/html; charset=windows-1250″>
<title></title>
<script>
var e = document.getElementById(‘mydiv’);
e.style.display = ‘none’;
</script>
</head>

<body>
<div id=”mydiv”>
Hello, How are you today?
</div>
</body>
</html>

Then you will get an javascript error: e is null. Because you can’t change the style of an element with javascript before the element is loaded in your page. But if you’re stubborn like me, you can write your javascript code end of your page.

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<html>
<head>
<meta http-equiv=”content-type” content=”text/html; charset=windows-1250″>
<title></title>

</head>
<body>
<div id=”mydiv”>
Hello, How are you today?
</div>
</body>
</html>
<script>
var e = document.getElementById(‘mydiv’);
e.style.display = ‘none’;
</script>

I tested the code above, in IE6 and FF.

Category: Javascript  | Leave a Comment