Rychlý export HTML stránky do PDF v PHP
Pokud potřebujete rychle vytvořit z HTML stránky PDF soubor a nabídnout jej ke stažení či poslat jej emailem v PHP, existuje na to výborná knihovna mPDF. Podporuje zpracování řady formátovacích prvků v CSS, nemusíte tedy HTML stránku či layout nijak speciálně upravovat.
Pokud máte třeba fakturu v eshopu připravenou jako HTML, je její převod do PDF otázkou pár řádků kódu:
require("mpdf/mpdf.php"); $mpdf = new mPDF('utf-8','A4'); $mpdf->useOnlyCoreFonts = true; $mpdf->SetDisplayMode('fullpage'); $mpdf->SetAutoFont(0); // CSS soubor $stylesheet = file_get_contents('faktura.css'); // faktura v HTML (PHP, atd.) $html = file_get_contents('faktura.html'); $mpdf->WriteHTML($stylesheet,1); $mpdf->WriteHTML($html,2); $name = "danovy-doklad.pdf"; $mpdf->Output($name,"D"); // download
Výsledek je až překvapivě dobrý, velikost vytvořeného PDF souboru s běžnou fakturou je kolem 25KB.
Pěkný tip, děkuji za něj.
Mám ještě dotaz, jak lze připojit více css souborů.
[1] vkládá se tam samotný obsah CSS, takže není problém je do té proměnné sloučit a následně pomocí $mpdf->WriteHTML($stylesheet,1); vložit
Má to jednu vadu. GNU General Public License version 2. Znamená to, že pokud to použijete v eshopu, musíte zveřejnit zdrojové kódy celého eshopu. Pokud to použijete v redakčním systému, musíte opět zveřejnit jeho zdrojové kódy. Knihovna je tedy dobrá jen tehdy, pokud zveřejnění zdrojových kódů není problém.
[3] to je zajímavá, leč zcela chybná úvaha. Použití GPL v2 knihovny (bez jejích modifikací) v projektu neznamená, že celý projekt musí být GPL v2. Poté by veškerý SW pro Linux musel být GPL, protože se napojuje na GPL knihovny / API. Jenže zde máme i closed source komerční SW.
A za druhé - GPL licence nikde nepožaduje "zveřejnit zdrojové kódy", natož pak třeba zdarma ke stažení pro každého. Tato POVINNOST není nikde v GNU GPL zakotvena.
Ale je fakt, že tento mýtus ohledně GPL dost lidí má.
[4]
Nejsou ty knihovny LGPL? To je pak něco jiného. V LGPL se pak píše, že program s přilinkovanou GPL knihovnou je podle GPL považován za odvozené dílo a tedy jeden z důvodů, proč vznikla LGPL.
GPL v2 jsem si teď pročetl, ale opravdu z toho nejsem moudrý. Vygenerovaná stránka z PHP se ale stejně asi nedá považovat za odvozené dílo (?), takže asi nedochází k žádné distribuci odvozeného díla (kdyby za to bylo považováno) a nebude tak na zdroják asi nárok ...
[5] je to GNU v2: http://mpdf.bpm1.com/licence
Ta říká, že díla odvozená musí být pod stejnou licencí. Použití API ale těžko považovat za "dílo odvozené". Jak píšu, poté by pro Linux nemohla existovat closed-source aplikace,..
[6] Z GPL FAQ: http://www.gnu.org/licenses/gpl-faq.html...
Q: If a library is released under the GPL (not the LGPL), does that mean that any program which uses it has to be under the GPL or a GPL-compatible license?
A: Yes, because the program as it is actually run includes the library.
Kousek nad tím
Q: In what cases is the output of a GPL program covered by the GPL too?
A: Only when the program copies part of itself into the output.
Osobně bych tedy považoval výstup "Ahoj" z programu obsahujícího echo("Ahoj") za odvozené dílo, protože vytiskl kousek sebe. Poskytnutí vygenerované stránky je tedy distribuce odvozeného díla z odvozeného díla a je tedy třeba poskytnout jeho zdrojové kódy.
Tak to chápu já a osobně se radši všemu, co je pod GPL, vyhnu velikým obloukem, než abych poté lezl po soudech a hádat se, jak to je :-)
No, Radku, vážně bych tu licenci radši pořádně pročetl, případně kdokoli to tady rozlouskne, tím líp. mPDF jsem se taky chystal přibalit do našeho "děcka" už asi před rokem, protože to považuju za nejlepší knihovnu pro převod HTML do PDF, ale právě kvůli GPL jsme místo mPDF radši použili jinou knihovnu (http://html2pdf.fr/ ) .. je to Xtá nadstavba nad TCPDF a hlavně to umí s několika výchozími fonty UTF-8, což je pro nás kritické. Jestli se ukáže, že je možné přibalovat do uzavřených řešení GPL v2 knihovny, tím líp.
[7] QaA na GNU.org nemá žádnou právní závaznost... Vzhledem k tomu, že spousta firem nabízí komerční closed-source aplikace pro Linux, je zjevné, že to jde. Jinak by "GPL virus" de-facto zakázal tento postup. Zveřejňuje třeba NVIDIA své zdrojové kódy ovladačů? Ne.
Navíc GPL nepožaduje distribuovat komukoliv zdrojové kódy na požádání, jen je musí dostat ten, kdo dílo obdrží (viz: The GPL does not require you to release your modified version, or any part of it. You are free to make modifications and use them privately, without ever releasing them.). Což v případě PHP dostává vždy... PHP a GPL prostě není problém, horší je to u kompilovaných projektů, kde člověk klientovi většinou nepředává automaticky i zdroják.
Nicméně, pokud člověk chce mít 100% jistotu, napíše si interní webovou službu pro převod HTML do PDF, tedy uvedených 10 řádek kódu, tu klidně licencuje pod GPL, a na tuto se napojí z aplikace (closed-source). A pokud by chtěl někdo argumentovat, že webová služba založená na GPL SW (cca 70% internetu) musí produkovat GPL výstup, tak je to debil. ;)
[9] Nejdůležitější je ta poslední věta! Ta je pravdivá a líbí se mi :-)
Na servru nemám podporu PHP ale ASP je možné udělat převod HTML do PDF?
[11] asi bych si doinstaloval Zend Server CE (zdarma) do IIS a používal ten převod z ASP jako webovou službu
Můj webhosting má jen podporu ASP, správce mi nedovolí nic na servr instalovat.
da se nejak prevest soubor .php?
[14] no samozřejmě, ten PHP soubor přece produkuje nějaké HTML, stačí je odchytit a vložit do $html uvedeného výše
Problém u této knihovny je, že se chová různě na serverech .... na některých funguje výstup normálně a na jiných s jinými parametry (stejné zkopírované soubory scriptů), hlásí chybu mPDF error: Some data has already been output to browser, can't send PDF file
Mám s mPDF problém, který se týká překročení paměťového limitu na serveru... Vím, že se to dá řešit zvýšením limitu, jenže pomocí toho generuju tabulky, které mohou být třeba na 10, 20 stránek....tudíž by pak nemusel stačit ani navýšený limit... Projel jsem dokumentaci a použil nastavení PackTableData, ale pořád to není dost... Nějaký nápad, jak tento problém obejít? Předem dík za odpověď.