Laravel ile proje geliştirirken raporlama işlemi için DomPdf kullanmam gerekti. Her şey güzel sorun yok derken, pdf dosyalarında ki Türkçe karakterlerde sorun olduğunu fark ettim. Birçok yöntem denememe rağmen sorun çözülmedi. Son olarak yabancı bir sitede gördüğüm yöntem ile sorunu çözdüm. Bu sorun için denediğim fakat çözüm olmayan yöntemleri de yazmak istiyorum.
Dil Kodlamasını UTF-8 Olarak Değiştirmek
Bu ilk denediğim yöntem oldu. Çünkü Dompdf download sayfasında dil kodlaması ile sorun yaşayanların meta etiketini UTF-8 yapmaları gerektiği yazıyordu. Hemen head etiketi arasına aşağıdaki kodu yapıştırdım.
1 |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> |
Sonra ne mi oldu. Sorun tabi ki çözülmedi.
Yazı Fontunu Değiştirmek
Yukarıda ki yöntem işe yaramadığı için çözüm bulmak için araştırma yaparken https://stackoverflow.com/questions/5136067/dompdf-special-characters konulu yazıya denk geldim. Burada yazı fontundan kaynaklı problem olabileceği vurgulanmış. Hemen Arial, Tahoma, Verdana, DeJaVu Sans Mono, monospace gibi fontlarla şansımı denedim. Ama değişen bir şey olmadı.
1 2 3 4 5 |
<style> *{ font-family:"DeJaVu Sans Mono",monospace; } </style> |
Eğer sizde şansınızı denemek istiyorsanız stil dosyanızın altına yukarıdaki css kodlarını yazarak sorunu çözmeye çalışabilirsiniz.
DomPdf Ayar Dosyası Değişiklikleri Yapmak
Bu yöntemde gayet mantıklı geldi. Dompdf ayar dosyası php ile proje geliştiriyorsanız dompdf_config.inc.php adıyla indirdiğiniz klasör içerisinde yer alıyor. Laravel için ayar dosyasına ulaşmak için DomPdf’yi kurduktan sonra php artisan vendor:publish komutuyla ayar dosyası oluşturabiliyorsunuz. Bu dosya üzerinde varsayılan birçok ayar değiştirilebiliyor. Varsayılan yazı tipini değiştirmekte buna dahil.
1 2 3 4 5 6 7 8 9 |
"DOMPDF_DEFAULT_FONT" => "opensans-regular", 'futural' => array ( 'normal' => DOMPDF_FONT_DIR . 'FUTURAL', 'bold' => DOMPDF_FONT_DIR . 'FUTURAL', 'italic' => DOMPDF_FONT_DIR . 'FUTURAL', 'bold_italic' => DOMPDF_FONT_DIR . 'FUTURAL', ), |
Yukarıdaki kodlar gibi birçok varyasyon denedim ama bir çözüme ulaşamadım.
DomPDF’ye Unicode Desteği Sağlamak
Son olarak yabancı bir sitede bu başlığa rastladım. Biraz zahmetli olsa da denediğimde sorun ortadan kalktı. Eğer yukarıdaki yöntemlerin hiçbiri işe yaramdıysa son olarak bunu deneyebilirsiniz. Sadece Türkçe karakter değil tüm diller için sorunun çözüleceğini belirtmek isterim.
Adım 1: Türkçe dil desteği olan bir font bulun. Bunun için google fonts içerisinde arama yaparak istediğiniz fontu kolayca bilgisayarınıza indirebilirsiniz.
Adım 2: Github üzerinde Dompdf’nin kendi sunduğu eklentiler arasında load_font.php dosyası bulunuyor. Bu bağlantıdan dosyayı indirin. https://github.com/dompdf/utils
Adım 3: İndirmiş olduğunuz yazı fontunu ve load_font.php dosyasını projenizin ana dizinine kopyalayın.
Adım 4: load_font.php dosyasını aşağıdaki şekilde düzenleyin.
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php // 1. [Required] Point to the composer or dompdf autoloader - require_once "autoload.inc.php"; + require_once "vendor/autoload.php"; // 2. [Optional] Set the path to your font directory // By default dopmdf loads fonts to dompdf/lib/fonts // If you have modified your font directory set this // variable appropriately. //$fontDir = "lib/fonts"; + $fontDir = "storage/fonts"; |
Bu kısımda son kodun oluşturulacak font dosyalarının kaydedileceği dizin olduğunu söyleme gerek. Eğer siz oluşturulacak dosyaları farklı bir dizine kaydetmek istiyorsanız son kısmı ona göre düzeltin. Laravel kullanıyorsanız son kısımda değişiklik yapmayın.
Adım 5: Komut satırını kullanarak projenizin ana dizinine gelin. Eğer projeniz bir sunu üzerindeyse aynı işlemi terminal/putty kullanarak yapabilirsiniz. Sonrasında aşağıdaki kodu çalıştırın.
1 |
php load_font.php "Font Name" OpenSans-Regular.ttf |
1 |
php load_font.php "opensans-regular" OpenSans-Regular.ttf |
1 2 3 |
dompdf_font_family_cache.php -> contains all the font name and the font location path OpenSans-Regular.ttf OpenSans-Regular.ufm |
1 2 |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <style>body { font-family: 'opensans-regular'; } </style> |
Bu yazıyı biraz daha geç bulsaydım yukarıdakine benzer bir senaryoyu ön koltukta izleyecektim, ileri sardırmış gibi oldu.
Merhaba, aynısı yaptım dediğin dosyalar oluştu ama font family kısmına ‘opensans-regular’ yazdığımda dikdörtgen şekiller ve bazı harfler çıkıyor.