Php İle Dinamik Bir Pdf Fatura Oluşturma Sistemi Nasıl Yapılır?

Php İle Dinamik Bir Pdf Fatura Oluşturma Sistemi Nasıl Yapılır?
Php İle Dinamik Bir Pdf Fatura Oluşturma Sistemi Nasıl Yapılır?

PHP ile Dinamik Bir PDF Fatura Oluşturma Sistemi Nasıl Yapılır?

Modern web uygulamalarında, kullanıcıların gerçekleştirdiği işlemlerin belgelenmesi kritik bir süreçtir. PHP ile dinamik bir PDF fatura oluşturma sistemi nasıl yapılır sorusu, e-ticaret sitelerinden abonelik tabanlı yazılımlara kadar pek çok projenin temel ihtiyacını oluşturur. Bu rehberde, sunucu tarafında verileri alıp profesyonel bir fatura formatına dönüştüren, ölçeklenebilir bir yapıyı adım adım inşa edeceğiz.

Bu makale, PHP'nin temel sözdizimine hakim olan ancak PDF oluşturma süreçlerinde profesyonel bir kütüphane kullanmak isteyen yazılım geliştiricileri için hazırlanmıştır. Eğitim sonunda, veritabanından çektiğiniz verileri dinamik olarak bir PDF dosyasına aktarabilecek ve bu dosyayı kullanıcıya sunabileceksiniz.

Gereksinimler ve Ön Hazırlık

Dinamik PDF oluşturma süreci için 2026 standartlarında en güvenilir yöntem Dompdf kütüphanesini kullanmaktır. Bu kütüphane, HTML ve CSS kodlarınızı doğrudan PDF formatına çevirmenize olanak tanır. Projenize başlamadan önce sisteminizde şu araçların yüklü olduğundan emin olun:

  • PHP 8.2 veya üzeri bir sürüm.
  • Composer (PHP paket yöneticisi).
  • Dompdf kütüphanesi.

Kurulumu gerçekleştirmek için terminal veya komut satırında projenizin ana dizinine giderek şu komutu çalıştırın:

composer require dompdf/dompdf

Bu komut, gerekli kütüphaneyi vendor klasörü altına indirecek ve otomatik yükleme (autoload) yapılandırmasını oluşturacaktır.

Adım 1: PDF Şablonu İçin HTML Yapısını Hazırlama

Dinamik fatura oluşturmanın ilk adımı, verilerin yerleşeceği bir iskelet (template) hazırlamaktır. HTML ve CSS kullanarak faturanızın görsel tasarımını oluşturun. Burada dikkat etmeniz gereken en önemli nokta, karmaşık JavaScript veya modern CSS Grid/Flexbox yapılarının PDF motorları tarafından bazen tam desteklenmediğidir. Daha stabil sonuçlar için table yapısını tercih edin.




    
        body { font-family: DejaVu Sans, sans-serif; }
        .fatura-tablosu { width: 100%; border-collapse: collapse; }
        .fatura-tablosu th, .fatura-tablosu td { border: 1px solid #ddd; padding: 8px; }
    


    

Fatura #{{fatura_no}}

Müşteri: {{musteri_adi}}

{{urunler}}
ÜrünFiyat

Bu şablon, PHP tarafında verilerle değiştirilecek yer tutucuları (placeholder) içermektedir.

Adım 2: PHP ile Veri Entegrasyonu ve PDF Oluşturma

Şablon hazır olduğuna göre, şimdi PHP kodlarını kullanarak bu şablonu doldurma aşamasına geçebiliriz. Dompdf sınıfını başlatıp HTML içeriğini yükleyeceğiz.

require 'vendor/autoload.php';
use Dompdf\Dompdf;

$dompdf = new Dompdf();

// HTML içeriğini değişkene alıyoruz
$html = file_get_contents('fatura_sablon.html');
$html = str_replace('{{fatura_no}}', '2026-001', $html);
$html = str_replace('{{musteri_adi}}', 'Ahmet Yılmaz', $html);

$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$dompdf->stream("fatura.pdf");

Yukarıdaki kod, şablon dosyasını okur, verileri yerleştirir ve tarayıcıya PDF olarak çıktısını verir.

Adım 3: PDF Oluşturma Yöntemleri Karşılaştırması

Projenizin ölçeğine göre farklı kütüphaneler tercih edebilirsiniz. Aşağıdaki tablo, 2026 yılı itibarıyla en popüler seçenekleri özetlemektedir.

Kütüphane Avantajı Dezavantajı
Dompdf Kolay öğrenim, HTML/CSS desteği Karmaşık CSS'lerde yavaşlık
TCPDF Çok güçlü, geniş özellikli Öğrenme eğrisi dik
Snappy (wkhtmltopdf) WebKit tabanlı, çok hızlı Sunucuya binary kurulumu gerekir

Adım 4: Güvenlik ve Hata Yönetimi

Dinamik içerik oluştururken en büyük risk XSS (Cross-Site Scripting) saldırılarıdır. Kullanıcıdan gelen verileri doğrudan HTML içine basmak, kötü niyetli kodların çalışmasına neden olabilir. Verileri mutlaka htmlspecialchars() fonksiyonu ile temizleyin.

Kritik Güvenlik Uyarısı: PDF oluştururken kullandığınız verilerin veritabanından güvenli bir şekilde çekildiğinden emin olun. Kullanıcı girdilerini asla doğrudan şablona dahil etmeyin. Üretim ortamında (production) hata raporlamasını kapatarak, sistem yollarının dışarıya sızmasını engelleyin.

// Güvenli veri temizleme örneği
$musteriAdi = htmlspecialchars($_POST['musteri'], ENT_QUOTES, 'UTF-8');
$html = str_replace('{{musteri_adi}}', $musteriAdi, $html);

Adım 5: Gelişmiş Tasarım ve Sayfa Numaralandırma

Profesyonel bir faturada sayfa numarası ve alt bilgi (footer) olmazsa olmazdır. Dompdf ile özel sayfalar eklemek için Canvas nesnesini kullanabilirsiniz.

$dompdf->render();
$canvas = $dompdf->getCanvas();
$font = $dompdf->getFontMetrics()->get_font("helvetica", "bold");
$canvas->page_text(500, 800, "Sayfa: {PAGE_NUM}/{PAGE_COUNT}", $font, 10, array(0,0,0));

Bu kod, PDF'in sağ alt köşesine sayfa numaralarını ekleyecektir.

Sıkça Sorulan Sorular

Dompdf neden Türkçe karakterleri göstermiyor?

Dompdf varsayılan olarak Unicode karakterleri tam desteklemeyebilir. Şablonunuzda etiketini kullandığınızdan ve desteklenen bir font (örneğin DejaVu Sans) tanımladığınızdan emin olun.

PDF dosyasını tarayıcıya indirtmek yerine sunucuya kaydetmek mümkün mü?

Evet, $dompdf->stream() yerine file_put_contents('fatura.pdf', $dompdf->output()); komutunu kullanarak dosyayı sunucu diskine kaydedebilirsiniz.

Faturaya nasıl görsel (logo) ekleyebilirim?

HTML içinde

Php İle Dinamik Bir Pdf Fatura Oluşturma Sistemi Nasıl Yapılır?
Php İle Dinamik Bir Pdf Fatura Oluşturma Sistemi Nasıl Yapılır?
şeklinde ekleme yapabilirsiniz. Ancak dosya yolunun sunucudaki tam yolu (absolute path) olduğundan emin olmalısınız.

Büyük verilerle çalışırken bellek (memory) hatası alıyorum, ne yapmalıyım?

PHP'nin memory_limit değerini ini_set('memory_limit', '512M'); ile artırabilir veya büyük tabloları parçalar halinde oluşturmayı deneyebilirsiniz.

PDF oluşturma işlemi çok yavaş, nasıl hızlandırabilirim?

Dışarıdan yüklenen CSS dosyalarını veya fontları yerel dizine çekin. İnternet üzerinden yapılan istekler PDF oluşturma süresini ciddi oranda uzatır.

PDF Faturalarını Otomatik E-posta ile Gönderme (PHPMailer Entegrasyonu)

Oluşturduğunuz PDF faturayı sunucuya kaydettikten veya bellekte oluşturduktan sonra, müşteriye anlık olarak iletmek profesyonel bir iş akışının temelidir. PHPMailer, SMTP protokolünü kullanarak güvenli ve hızlı bir e-posta gönderim süreci sağlar.

Aşağıdaki örnek, oluşturulan PDF dosyasını e-postaya ek olarak (attachment) nasıl ekleyeceğinizi göstermektedir:

use PHPMailer\PHPMailer\PHPMailer;

$mail = new PHPMailer(true);

try {
    $mail->isSMTP();
    $mail->Host = 'smtp.ornekmail.com';
    $mail->SMTPAuth = true;
    $mail->Username = 'fatura@siteniz.com';
    $mail->Password = 'sifreniz';
    $mail->Port = 587;

    $mail->setFrom('fatura@siteniz.com', 'Muhasebe Departmanı');
    $mail->addAddress('musteri@email.com');
    
    // PDF dosyasını ekle
    $mail->addAttachment('faturalar/fatura_12345.pdf');

    $mail->isHTML(true);
    $mail->Subject = 'Yeni Faturanız Ektedir';
    $mail->Body    = 'Sayın müşterimiz, ilgili dönem faturanız ekte yer almaktadır.';

    $mail->send();
    echo 'Fatura başarıyla gönderildi.';
} catch (Exception $e) {
    echo "Hata: {$mail->ErrorInfo}";
}

PDF Üretiminde Hata Ayıklama (Debugging) Teknikleri

PDF oluşturma süreçlerinde en sık karşılaşılan sorunlar, genellikle CSS uyumsuzlukları veya eksik dosya yollarıdır. Hata ayıklama sürecini hızlandırmak için şu stratejileri izleyebilirsiniz:

1. HTML Çıktısını İnceleme

PDF kütüphanesine göndermeden önce oluşturduğunuz HTML yapısını bir tarayıcıda görüntüleyin. Eğer HTML tarayıcıda düzgün görünmüyorsa, PDF çıktısında da düzgün görünmeyecektir.

// PDF oluşturmadan önce HTML'i ekrana yazdırın
echo $html; 
exit; // PDF kütüphanesini çalıştırmadan durdurun

2. Hata Günlüklerini (Log) Takip Etme

Dompdf veya TCPDF gibi kütüphaneler, bir hata oluştuğunda genellikle sessiz kalabilir veya sadece boş bir sayfa döndürebilir. PHP hata raporlamayı en üst seviyeye çekerek gizli hataları görünür kılın:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

3. Dosya Yolu Kontrolleri

Sunucu tarafında dosya yollarını belirtirken __DIR__ sabitini kullanmak, "dosya bulunamadı" hatalarını engellemenin en güvenli yoludur:

$logoPath = __DIR__ . '/assets/img/logo.png';
if (!file_exists($logoPath)) {
    throw new Exception("Logo dosyası bulunamadı: " . $logoPath);
}

Bu yöntemlerle, üretim ortamına geçmeden önce olası tüm darboğazları ve hata noktalarını tespit edebilir, sisteminizin kararlılığını artırabilirsiniz.

Sonuç

PHP ile dinamik bir PDF fatura oluşturma sistemi kurmak, doğru kütüphane ve güvenlik önlemleriyle oldukça verimli bir süreçtir. Bu rehberde, temel şablon oluşturmadan güvenlik önlemlerine kadar kritik adımları inceledik. Bir sonraki adım olarak, oluşturulan bu PDF'lerin otomatik olarak müşteriye e-posta ile gönderilmesi için PHPMailer kütüphanesini entegre etmeyi düşünebilirsiniz.

Yasal Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Yazılım güvenliği sorumluluğu geliştiriciye aittir. Üretim ortamında kullanmadan önce tüm girdileri doğrulayın ve yetkilendirme kontrollerini eksiksiz yapın.

Bu yazıya tepkinizi paylaşın:
Mert Demir

Hobi projeleri, küçük tamirat işleri ve bahçe bakımı konusunda deneyimli bir editörüm. Adım adım rehberlerimle okuyucularımın özgüvenli bir şekilde yeni beceriler kazanmasını amaçlıyorum.

Yorumlar (0)

Yorum Yaz