PHP a tvorba PDF dokumentov za pomocou mPDF
V predchádzajúcom cvičení, Riešené úlohy k 1.-2. lekciu práca so súbormi v PHP, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V tomto tutoriále popíšem ako pomocou PHP a knižnice mPDF vytvárať PDF dokumenty. Veľmi laicky povedané vám umožní vziať HTML kód aa vytvoriť z neho PDF súbor. Zo skúseností viem, že nie všetko to funguje. Niekedy bol problém s HTML alebo CSS, môžete sa pozrieť na tabuľku podporovaných tagov. Avšak sa jedná o užitočnú triedu. Môžete s jej pomocou ľahko vytvárať faktúry vo svojom e-shope a ďalšie veci, na ktoré sa tento formát hodí. (Denné menu v reštaurácii, cenník služieb atď).
Jednoduchá ukážka
Teraz pristúpime k samotnému tvoreniu. Ako je zvykom u nových vecí, začneme aj tu s "Hello itnetwork.cz"
- Stiahnite si mpdf z webu: http://www.mpdf1.com/mpdf/download. Ja som stiahol najnovšie Full-instalation v 5.7.
- Vytvorte si adresár v roote vášho webu. Napríklad: pdf_export a rozbaľte do neho zložku z archívu.
Teraz už k prvej ukážke:
<?php /*Načtení třídy mpdf, pozor na číslo za MPDF - v mém případě 57, ale může se lišit*/ include('MPDF57/mpdf.php'); /*vytvoření objektu*/ $mpdf=new mPDF(); /*Přidání HTML*/ $mpdf->WriteHTML('<p>Hello itnetwork</p>'); /*Výstup*/ $mpdf->Output(); exit; ?>
Výstupom bude zaslanie PDF dokumentu prehliadači. Ak prehliadač podporuje zobrazenie PDF, tak súbor otvorí. Inak sa bude súbor sťahovať na disk. Výstup zaisťuje metóda Output (), ktorá po odovzdaní určitých parametrov môže výstup vykonávať inak ale o tom neskôr.
Štýlovanie
Vrátime sa k prvej ukážke a skúsime si pridať CSS. CSS musí byť vložené medzi tagy
<style></style>
Externý css súbor nepôjde načítať!
A pokojne takto to môže vyzerať s CSS
<?php /*Načtení třídy mpdf pozor na číslo za MPDF v mém případě 57 ale může se lišit*/ include('MPDF57/mpdf.php'); /*vytvoření objektu*/ $mpdf=new mPDF(); $css= "<style> .cssTridaProPDF{ margin-bottom:20px; font-weight:bold; font-size:34px; font-family:sans-serif; border-bottom:3px solid #333; color:teal; } </style> "; /*Přidání HTML s se styly v proměné $css*/ $mpdf->WriteHTML("$css<p class='cssTridaProPDF'>Hello itnetwork</p>"); /*Výstup*/ $mpdf->Output(); exit; ?>
Stránkovanie
Možno premýšľate nad tým, čo sa stane ak obsah presiahne stránku. Aj na toto vývojári mysleli. Nasledujúci príklad ukáže čo sa stane ak sa pokúsime exportovať veľký (dlhý) obsah.
<?php /*Načtení třídy mpdf pozor na číslo za MPDF v mém případě 57 ale může se lišit*/ include('MPDF57/mpdf.php'); $mpdf=new mPDF(); for($i=1;$i<=1000;$i++){ $mpdf->WriteHTML("Řádek číslo: $i <BR>"); } $mpdf->Output(); ?>
Áno, obsah sa rozstránkuje sám . Avšak skôr budete chcieť mať plnú kontrolu na akej stránke čo bude k tomu slúži metóda AddPage ().
Nasledujúci príklad vytvorí 10 stránok každú pomocou metódy AddPage ();
<?php /*Načtení třídy mpdf pozor na číslo za MPDF v mém případě 57 ale může se lišit*/ include('MPDF57/mpdf.php'); $mpdf=new mPDF(); for($i=1;$i<=10;$i++){ $mpdf->AddPage(); $mpdf->WriteHTML("<h1>Stránka č.$i <h1>"); $mpdf->WriteHTML("<p>Lorem ipsum.....<p>"); } $mpdf->Output(); ?>
Vytvorenie rozmanitejšieho dokumentu
Predošlé ukážky boli len také "hrania". Poďme teraz vytvoriť niečo užitočného. Nenapadá ma nič iné ako vygenerovanie faktúry (práve tak som sa zoznámil s mPDF) .
Začneme testovacími dátami:
<?php $dodavatel=array( "firma"=>"ITnetwork Pro Web design", "adresa"=>"345 Park Ave, San Jose, CA 95110, United States", "ico"=>"00112233" ); $odberatel=array( "firma"=>"Tuning ponorek, s.r.o.", "adresa"=>"Mesto, ulice 1/3, 12345", "ico"=>"12345678" ); $web=array( "pocet"=>1, "polozka"=>"Vytvoření webové prezentace", "cena"=>12000 ); $polozky_k_fakturaci=array($web); ?>
Určite ste si všimli, že premenná $ polozky_k_fakturaci je pole polí. To je z dôvodu ľahkého formátovanie výstupu a výpočtu. Tak, dáta máme pripravená, teraz potrebujeme šablónu. Samozrejme, že možno použiť rozumnejšie riešenie ako mať v jednom súbore CSS HTML PHP. Správne riešenie by bolo načítať súbory dynamicky za behu, odkazujem na skvelý seriál http://www.itnetwork.cz/...architektury, ale to je trošku nad rámec tohto článku.
Teraz potrebujeme CSS, aby naše faktúra nejako vyzerala
<style> body{ font-family:sans-serif; } h1{ text-align:right; margin:0px; } h2{ font-weight:normal; font-size:23px; } .dodavatel{ float:left; border:1px solid black; width:300px; height:300px; padding:5px; } .odberatel{ float:right; border:1px solid black; width:300px; height:300px; padding:5px; } div p span{ font-weight:bold; } table{ width:100%; } th{ text-align:left; } h3{ text-align:right; margin-top:50px; } </style>
Nezabudnite celé CSS vpísať pomocou metódy WriteHTML (). Tak štýly by sme mali. Teraz potrebujeme rozloženie (šablónu). Ešte raz zdôrazňujem, efektívnejšie je mať všetko oddelené.
Teraz zdrojový kód šablóny s vpísaním premenných:
$mpdf=new mPDF(); $mpdf->WriteHTML($css); //Načtení CSS $mpdf->WriteHTML(" <h1>Faktura číslo: 4647</h1> <hr> <div style='width:100%'> <div class='dodavatel'> <h2>Dodavatel</h2> <p> <span>Obchodní název:</span> $dodavatel[firma] </p> <p> <span>Adresa:</span> $dodavatel[adresa] </p> <p> <span>IČO:</span> $dodavatel[ico] </p> </div> <div class='odberatel'> <h2>Odběratel</h2> <p> <span>Obchodní název:</span> $odberatel[firma] </p> <p> <span>Adresa:</span> $odberatel[adresa] </p> <p> <span>IČO:</span> $odberatel[ico] </p> </div> </div> <hr> <table> <tr> <td>Datum vystavení</td> <td>11.11.2014</td> <td>Datum splatnosti</td> <td>12.12.2014</td> </tr> </table> <hr> <h2>Položky:</h2> <table border='1' cellspacing='0' cellpadding='2'> <tr> <th>Množství</th> <th>Název</th> <th>Cena</th> </tr> "); $cena_celkem=0; foreach($polozky_k_fakturaci AS $polozka){ $mpdf->WriteHTML(" <tr> <td>$polozka[pocet] x</td> <td>$polozka[polozka]</td> <td>$polozka[cena],- CZK</td> </tr> "); $cena_celkem+=$polozka['cena']; } $mpdf->WriteHTML("</table>"); $mpdf->WriteHTML("<h3>Celkem $cena_celkem,- CZK</h3>");
A na záver vypísanie výstupe.
$mpdf->Output();
Výstup dokumentu
Metóda Output () nám zabezpečuje výstup. Zatiaľ sa nám zobrazoval v prehliadači. Samozrejme len ak prehliadač podporuje PDF. Pozrieme sa na to, aké parametre môžeme dať do metódy Output ().
$mpdf->Output('NasSoubor.pdf','F'); // soubor se uloží na serveru první parametr:NasSoubor.pdf může obsahovat i cestu např: PDF_doc/NasSoubor.pdf $mpdf->Output('NasSoubor.pdf','I'); // pošle dokument prohlížečí pokud je dostupný plugin soubour se zobrazí, pokud ne soubor se stáhne $mpdf->Output('NasSoubor.pdf','D'); // Vynutí stažení souboru
Záver
Nepochybne so mnou súhlasíte, že použité CSS dá napísať lepšie. Bohužiaľ nejaké CSS atribúty nefungujú tak, ako sme zvyknutí.
Po stiahnutí triedy z webu mPDF a otvorenie adresára MPDF57 sa nezľaknite. Je tu mnoho adresárov a súborov ako sú fonty alebo príklady. MPDF má kvalitné online dokumentáciu na: Dokumentácia.
Dokážem si predstaviť využitie mPDF na vyvoření katalógu E-Shope alebo pokojne publikáciu knihy. Je to môj prvý normálny článok tu na ITnetwork, tak dúfam, že som vás nesklamal. Ak som niečo dôležité opomenul alebo chýba to, čo vás zaujíma, napíšte do správ alebo pod článok komentár a rád informácie doplním.
V ďalšej lekcii, Práca so súbormi XML v PHP , sa zoznámime s prácou so súbormi vo formáte XML. Preberieme si triedy XMLWriter, XMLReader a SimpleXML.