Nedávno jsem při pátrání po nějakém šikovném generátoru PDF narazil na velmi zajímavou knihovnu – wkhtmltopdf. Zaujala mě svou jednoduchostí a přesností převodu html výstupu do PDF natolik, že jsem se rozhodl použít ji v několika sých projektech.
Abych nechodil daleko, integrace do tolik mnou oblíbeného Kohana frameworku je tak jednoduchá a přímá, že se sní zde pochlubím. Wkhtmltopdf převádí html kód do PDF. Knihovna je spustitelný binár a vlastní převod se volá například takto:
wkhtmltopdf http://www.nejaka-domena/prevadena-stranka.html
případně
wkhtmltopdf /cesta/k/html/souboru.html.
… tedy přinejmenším voláme alespoň s jedním parametrem – převáděným souborem. Seznam všech parametrů lze najít na code.google.com. V adresáři application/vendor vytvoříme adresář například “pdf_export”, do kterého uložíme obslužnou třídu pro volání knihovny. Nebudu uvádět žádný příklad, snad jen doporučení, že tato třída by měla zařídit vlastní převod a měla by manipulovat se soubory. Řekněme, že skript se bude jmenovat “wkhtmltopdf.php” a třída v něm “wkhtmltopdf”. Integrace v controlleru pak vypadá například takto:
require Kohana::find_file('vendor','pdf_export/wkhtmltopdf',$required=TRUE,$ext='php');
$this->pdf = new wkhtmltopdf;
Převáděnou stránku si připravíme tak, že v použitém controlleru necháme View zpracovat, ale nevypíšeme jej na výstup, ale uložíme si jej do proměnné. Tedy pouze
$vygenerovane_html = $view->render();
V proměnné “$vygenerovane_html” tedy máme celý html výstup. V tento okamžik je vhodné předat jej naší obslužné třídě “wkhtmltopdf” a provést vlastní konverzi do PDF. Tato třída nám může pak vygenerované PDF vrátit (fread() apod) a my jej můžeme poslat na výstup s patřičnými hlavičkami jako download:
$file = $this->save_html_to_file($vygenerovane_html);
$pdf_soubor = $this->pdf->file_convert($file,'/tmp/');
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$filename);
echo $pdf_soubor;
Metoda “save_html_to_file()” v mém případě slouží k uložení html výstupu do lokálního souboru, metoda “file_convert()” třídy “pdf” pak k vlastní konverzi a načtení vygenerovaného PDF do proměnné “$pdf_soubor”. Echo nakonec pak po odeslání hlaviček pošle PDF soubor prohlížeči.
Zdravím, řešil jste už upload více souborů v Kohaně? Pořád hledám nějaké řešení a nic.
Mám za to, že to nebude předmětem frameworku. Jestli to chápu správně, potřebujete nahrávat více souborů najednou – tedy je potřeba si je připravit na straně klienta (například hromadné nahrávání obrázků do galerie?). Tedy typicky hledáme buď AJAX řešení, nebo Flash řešení (například toto: http://www.swfupload.org). Na straně frameworku pak bude existovat jen alespoň controller, který bude nahrávaná data zpracovávat. Osobně jsem nic takového nikdy neimplementoval. Pokud je mi známo, Menalto Gallery3 je přímo software pro správu obrázkových galerií a co jsem měl možnost vidět, je to v podstatě jen čistá KOHANA. Multinahrávání je tam také zpracováno. Tedy možná inspirace zde.
Tutorial jen uvitam, aspon bude co dat na nove pripravovane kohanautske stranky
))
On neni ani tak problem v nahravani vice souboru, jakoz to jejich validace.
Schudna cesta je pomoci nejakeho Flash multi files uploaderu, nahrat po jednom do “tempu”, ulozit si cesty k temto souborum a posleze toto pole hodnot validovat.
Co vim, tak stale kohana nema validaci vice souboru podle *(wildcard).
… no s odstupem času se vracím k uploadu souborů, respektive jejich validaci. Kohana je na to samozřejmě připravená
Má na to svoji vlastní validační třídu a Upload třídu. Můžu poskytnout nějaký fragment kódu v případě, že bude zájem.