Pdf çevirme sorunu.
ztemet opened this issue · 9 comments
Merhaba mPdf kütüphanesi html olarak gelen datayı bozuk (sayfa düzeni dağınık) bir şekilde çeviriyor. mpdf yerine düzgün çeviren alternatif kütüphane var mı bildiğiniz ya da kullandığınız?
Daha önce İbrahim Bey "Ben pdf çevirmede daandesmedt\PHPHeadlessChrome kullanarak çözdüm. Pdf çevirmelerinde tavsiye ederim." bu yöntemi önermiş fakat bu kütüphane Chrome motoru ile çevirdiğinden hosting izinleri dolayısıyla kullanamıyorum.
Html olarak gelen faturada hiç bir problem yok faturayı Pdf'e düzgün formatta çevirmek için yardımlarınızı bekliyorum.
Sanırım PHPHeadlessChrome kendi sunucunuzda Selenium ile yapıyor bu işi. İlgili paketin verdiği örnekler de Windows sunucu gibi verilmiş. Yani kendi Windows bilgisayarınızda PHP sunucusunda kullanıyorsanız o paket işinizi çözebilir.
Denemediğim fakat aklıma gelen bir yöntem olarak, sayfayı HTML olarak ekrana basıp sonuna ufak bir JS ekleyip PDF'e çevrilebilir yada yine bir JS ilse PDF şeklinde yazdırılabilir. Ancak sunucuya kayıt etmeye çalışıyorsanız maalesef mPdf faturalar konusunda sıkıntılı.
Öncelikle cevabınız için teşekkür ederim Murat Bey.
Html olarak gelen datayı dediğiniz gibi Javascript kodu ile dönüştürmeyi defalarca farklı yöntemlerle yapmaya çalıştım hatta stackoverflow sitesinde de daha önce soranlar olmuş okuduğum tüm cevapların hiç biri fayda etmedi.
Pdf'i sunucuya kaydetme niyetim yok sadece faturayı pdf olarak görüntülemek ve bilgisayarıma indirmek istiyorum. mPdf bu işlemi yapıyor ama sayfanın düzeni bozuk bir şekilde aşağıda örneğini ekledim;
PHPHeadlessChrome ile ilgili yaşadığım sorun ise kodları paylaşımlı hosting üzerinde çalıştırdığımdan sanırım bu yüzden hata alıyorum. mPdf alternatif olarak dompdf ve bir kaç tane daha kütüphane denedim malesef hepsi yukarıda ki resimdeki gibi pdf düzenini bozuk olarak çevirdi. :(
Ben windows ve Linux (centos) sunucuda chrome ile çözdüm. Windows sunucuda PHPHeadlessChrome ile linuxta ise BrowserFactory paketi ile pdf çeviriyorum.
hosting üzerinden eğer chrome eklentisini yükletebilirseniz BrowserFactory ile pdf çevirebilirsiniz. Aşağıda kullandığım pdf çevirme kodları mevcuttur.
Linuxta kullandığım browserFactory ile pdf çevirme kodu
$browserFactory = new BrowserFactory("google-chrome-stable");
$browser = $browserFactory->createBrowser();
try {
$page = $browser->createPage();
$page->navigate(base_url().'Ebelge?ETTN='.$ETTN)->waitForNavigation();
$pageTitle = $page->evaluate('document.title')->getReturnValue();
$page->pdf(['printBackground' => false])->saveToFile($_SERVER["DOCUMENT_ROOT"].'/Fatura/'.$ETTN.".pdf");
return true;
}
catch (Exception $e) {
return false;
} finally {
$browser->close();
}
Windowsta kullandığım HeadlessChrome ile pdf çevirme kodu
$headlessChromer = new HeadlessChrome();
$headlessChromer->setUrl(base_url().'Ebelge?ETTN='.$value);
$headlessChromer->setBinaryPath('C:\Program Files (x86)\Google\Chrome\Application\chrome');
$headlessChromer->setOutputDirectory($_SERVER["DOCUMENT_ROOT"].'\Fatura');
$headlessChromer->disablePDFHeader();
$headlessChromer->toPDF($value.'.pdf');
return $headlessChromer->getFilePath();
Cevabınız için sağ olun İbrahim Bey. mPdf gibi bir yöntem bulamazsam hostingi değiştirip bu önerdiğiniz yöntemi deneyeceğim.
Şu satırda sayfa adresinin çalışma prensibi tam olarak anlayamadım.
$page->navigate(base_url().'Ebelge?ETTN='.$ETTN)->waitForNavigation();
Pdf oluşturma işlemini aşağıdaki gibi yapıyorum.
Sizin verdiğiniz yöntemi yukarıdaki gibi nasıl kullanabilirim. Faturanın uuid değerini çekip $ettn değişkeni yerine yazınca base_url() adresi kendi domain adresimi işaret etmez mi?
https://domainadresi.com/Belge?ETTN=65048d50-9ac1-11ec-b0ee-00155d725aad adresi faturanın html formatında gösteriyor.
$headlessChromer->setUrl($Url)
şeklinde kullanırsak url adresini pdf formatına çeviriyor. $headlessChromer->setHTML($html)
şeklindede kullanabilirsiniz.
Tamamdır şimdi anladım teşekkür ederim yardımınız için. 👍
[ibrcan] arkadaştan cevap bekledim kendi gönderisi altında ama görmedi galiba bende aşağıdaki şekilde çözüme ulaştım
bu kodu php ile çekilen html stringinin sonuna ekledim daha sonra html dosyasını
file_put_contents("fatura/".$faturaid.".html", $html);
komudu ile kaydettim daha sonrada kaydettiğim dosyayı tarayıcıda açtığımda pdf olarak indiriyor.
tabi ben geliştirip indirmeden geri sunucuya kayıt ve daha sonra da mail atma işlemini de yapıyorum.
html2pdf js versiyonunu kullanarak çözdüm ben.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js" integrity="sha512-GsLlZN/3F2ErC5ifS5QtgpiJtWd43JWSuIgh7mbzZ8zBps+dvLusV+eNQATqgA/HdeKFVgA5v3S/cIrLF7QnIg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>var data = $("body").html();
data = data.replace(/800/g, "1100");
var opt = {
margin: 0.10,
filename: filename,
image: { type: "jpeg", quality: 0.98 },
html2canvas: { dpi: 192, letterRendering: true, width: 1100, height: 1550, scrollX: 0, scrollY: 0 },
jsPDF: { unit: "in", format: "a4", orientation: "portrait" }
};
html2pdf().from(data).set(opt)..save();
Umarım İşinize Yarar. Kolay Gelsin.
[gvngzl] Hocam çok sağ ol cevabın için. Html2pdf ile yaptığın işlemdeki kodlar html sayfanın içeriğini alıp pdf'e dönüştürüyor. Verdiğiniz kodda data değişkeninde sayfanın body içeriği var (var data = $("body").html(); ) bu durumda yukarıda verdiğiniz kodları faturanın html sayfasının içerisine mi yazdınız?
html olarak çektiğimiz fatura değişkeninin sonunda $html.sonra verdiğim kodlar; şeklinde ekleyip daha sonra file_put_contents("fatura/".$faturaid.".html", $html); komudu ile kaydedin kaydettiğiniz sayfayı açtığınız da direk pdf olarak indirecektir.