[GH-ISSUE #71] Pdf çevirme sorunu. #49

Open
opened 2026-03-02 04:06:32 +03:00 by kerem · 9 comments
Owner

Originally created by @ugurorun on GitHub (Mar 2, 2022).
Original GitHub issue: https://github.com/furkankadioglu/efatura/issues/71

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.

Originally created by @ugurorun on GitHub (Mar 2, 2022). Original GitHub issue: https://github.com/furkankadioglu/efatura/issues/71 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.
Author
Owner

@muratcesmecioglu commented on GitHub (Mar 2, 2022):

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ı.

<!-- gh-comment-id:1056857554 --> @muratcesmecioglu commented on GitHub (Mar 2, 2022): 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ı.
Author
Owner

@ugurorun commented on GitHub (Mar 2, 2022):

Ö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;

image

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. :(

<!-- gh-comment-id:1056884483 --> @ugurorun commented on GitHub (Mar 2, 2022): Ö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; <img width="425" alt="image" src="https://user-images.githubusercontent.com/54245222/156362423-bcf6617a-1a01-4360-ad44-7cca136e272e.png"> 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. :(
Author
Owner

@ibrcan commented on GitHub (Mar 3, 2022):

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();

<!-- gh-comment-id:1057760105 --> @ibrcan commented on GitHub (Mar 3, 2022): 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();
Author
Owner

@ugurorun commented on GitHub (Mar 3, 2022):

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.

image

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?

<!-- gh-comment-id:1057856655 --> @ugurorun commented on GitHub (Mar 3, 2022): 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. <img width="263" alt="image" src="https://user-images.githubusercontent.com/54245222/156536623-0bb9d025-9084-4e3f-bb80-2cf8064d2531.png"> 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?
Author
Owner

@ibrcan commented on GitHub (Mar 3, 2022):

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.

<!-- gh-comment-id:1057885291 --> @ibrcan commented on GitHub (Mar 3, 2022): 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.
Author
Owner

@ugurorun commented on GitHub (Mar 3, 2022):

Tamamdır şimdi anladım teşekkür ederim yardımınız için. 👍

<!-- gh-comment-id:1057895498 --> @ugurorun commented on GitHub (Mar 3, 2022): Tamamdır şimdi anladım teşekkür ederim yardımınız için. 👍
Author
Owner

@gvngzl commented on GitHub (Mar 4, 2022):

[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.

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.

<!-- gh-comment-id:1058924990 --> @gvngzl commented on GitHub (Mar 4, 2022): [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.
Author
Owner

@ugurorun commented on GitHub (Mar 4, 2022):

[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?

<!-- gh-comment-id:1058948203 --> @ugurorun commented on GitHub (Mar 4, 2022): [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?
Author
Owner

@gvngzl commented on GitHub (Mar 4, 2022):

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.

<!-- gh-comment-id:1058959508 --> @gvngzl commented on GitHub (Mar 4, 2022): 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.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/efatura#49
No description provided.