"Enter"a basıp içeriğe geçin

DomPDF ile Php’de PDF oluşturma [Türkçe Karakter Destekli]

Merhaba arkadaşlar php ile pdf oluşturma konusunda bir çok kaynak var fakat bir çoğunda da türkçe karakter problemi yaşanıyor. Zaten yabancı kaynakları hiç saymıyorum. Kesin çözümlü olan güncel bir kaynak bulamadım.

HTML çıktısını PDF’e dönüştürme konusunda DOMPDF kullanıyoruz.

DomPDF ile default olarak Türkçe karakterleri destekleyen DejaVu Sans font beraberin geliyor. Ama hazırladığınız projede özel olarak kullanmak istediğiniz bir font varsa ekstra font tanımlamanız gerekli.

DomPDF Güncel versiyonu ile sizlere çözümü anlatacağım.

DomPDF ile ilgili bir ikinci yaşanan problem ise Php&MySQL ile veri tabanından güncel data çekip pdf oluşturmak istediğinizde ise load ettiğiniz dosya html değilse yine başarılı olamayacaksınız.

Fazla lafı uzatmadan gelelim DomPDF‘e özel font eklemeye.

Fontu internette çeşitli sitelerden indirebilirsiniz veya sisteminizden de bir font *.ttf uzantılı dosyayı alıp kullanabilirsiniz.

Sistemden bir fontu kullanacaklar

Windows kullanıcıları için;

C:\Windows\Fonts dizini altında bulabilirsiniz.

Mac OsX kullanıcıları için;

/Users/[Kullanıcı Adı]/Library/Fonts dizinin altında bulabilirsiniz.

Örnek olarak kullandığımız fontumuz Courier New

Courier New font ailesinde bulunan Courier New Regular, Courier New Bold, Courier New Bold Italic ve Courier New Italic ttf dosyalarımız var.

Bu TTF dosyalarımızı /dompdf/lib/fonts dizini altına kopyalayın. (Sunucunuzda bu dizinin yazma izinlerini 707 yapmanız yeterli olacaktır.)

Dönüştüreceğinzi dosyanız için kullandığınız CSS dosyasına aşağıdaki örnekteki gibi tanımlama yapın.

@font-face {
font-family: 'Courier New TR';
font-weight: normal;
font-style: normal;
font-variant: normal;
src: url("../dompdf/lib/fonts/Courier-New-TR-Regular.ttf") format("truetype");
}
@font-face {
font-family: 'Courier New TR';
font-weight: bold;
font-style: normal;
font-variant: normal;
src: url("../dompdf/lib/fonts/Courier-New-TR-Bold.ttf") format("truetype");
}
@font-face {
font-family: 'Courier New TR';
font-weight: bold;
font-style: italic;
font-variant: normal;
src: url("../dompdf/lib/fonts/Courier-New-TR-Bold-Italic.ttf") format("truetype");
}
@font-face {
font-family: 'Courier New TR';
font-weight: normal;
font-style: italic;
font-variant: normal;
src: url("../dompdf/lib/fonts/Courier-New-TR-Italic.ttf") format("truetype");
}

Dikkat: Örnek kullandığımız font “Courier New” bu fontu font-face ile tanımlarken sonuna TR eklememiz gerekiyor. Kullanıcının bilgisayarında “Courier New” font bulunuyor ve türkçe karakter destekli değilse eğer sistemdeki fontu kullanmak isteyecektir, ve sonuç alamayacağız. O sebeple font-face de tanımlama yaparken font-family alanına font adı onuna TR ekliyoruz.

Php ile MySQL veri tabanından güncel veriyi çekerek bir pdf oluşturmak için aşağıdaki kodları kullanmanız gerekiyor.

Yorum satırları ile detaylı bir şekilde açıklamalar yapmaya çalıştım.

<?php ob_start();?>
<?php
  /* MYSQL Database Bağlantısı */
  $db_host = 'localhost';
  $db_user = 'root';
  $db_pass = 'root';
  $db_database = 'db_phppdf'; 
  $conn = @mysql_connect($db_host,$db_user,$db_pass);
  if(!$conn){
    die("Baglanti hatasi:");  
  } 
  $db_select = mysql_select_db($db_database,$conn);
  if(!$db_select){
    die("Veritabani hatasi: "); 
  }
  mysql_query("SET NAMES UTF8");
  session_start();
  /* MYSQL Database Bağlantısı */
?>
<?php
  $query = mysql_query("SELECT * FROM table_data WHERE id='1'");
  $row = mysql_fetch_array($query);
  $title = $row['title'];
  $content = $row['content'];
?>
<!-- Pdf dosyamızın içerik başlangıcı -->
<html lang="tr">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link rel="stylesheet" href="css/custom.css">
    <title><?=$title?></title>
  </head>
  <body>
  <h1><?=$title?></h1>
  <?=$content?>
  <img src="img/sample-img.jpg" width="100%" />
</body>
</html>
<!-- Pdf dosyamızın içerik sonu -->
<?php
  $html = ob_get_clean();
  require_once 'dompdf/autoload.inc.php';
  use Dompdf\Dompdf;
  use Dompdf\Options;
  // DomPdf options ile Php kullanımını aktif etmeniz gerekiyor. Aksi takdirde php ile gönderdiğiniz sorgular çalışmayacaktır.
    $options = new Options();
    $options->set('isPhpEnabled', TRUE);
    $dompdf = new Dompdf($options);
    $dompdf->loadHtml($html);
    
  // Bu satırda pdf dosyamızın ölçüsünü belirliyoruz. Örnek A4 ve (portrait) Dikey olacak gibi.. Yatay yapmak için Landscape yazmanız yeterli.
    $dompdf->setPaper('A4', 'portrait');

  // Html çıktısı pdf'e dönüştürülüyor.
    $dompdf->render();

  // Attachment değerini 0 verirseniz pdf dosyanız browser üzerinden görüntülenecektir. 1 verirseniz kullanıcının bilgisayarına indirme işlemine geçecektir.
    $dompdf->stream("bswebtools-blog",array("Attachment"=>0));
?>

Statik bir html dosyasını pdf yapmak istiyorsanız. Aşağıdaki komutu kullanabilirsiniz.

$html = file_get_contents('test.html');

Örnek kodları indirmek ve Demo için

Demo | GitHub

Tek Yorum

  1. Hakan Aras Hakan Aras

    Merhaba ,
    Elinize sağlık çok temiz olmuş.
    PDO ile hazırladım ama bür türlü Tr karekterleri düzgün çıkaramadım.
    Bootstap 4 css kullanıyorum. Sitede sorun olmuyo ama pdf de sorun çıkyor.
    Mac kullanıyprum. dediğiniz fontları da ve stil sayfasını da ekledim.
    Hala fontlar hatalı çıkıyor.

Bu yazı yorumlara kapalı, ama geri izlemeler ve pingback'ler açık.