Gyorsabb azonnali Pdf generálás

Egy webalkalmazás fejlesztése során az egyik feladat egy végső pdf dokumentum elkészítése volt. Egész pontosan egy online gépjármű értékelés eredményének megjelenítése pdf formátumban. Az értékeléshez szükséges adatokat és magát az értékelést az Eurotax webservice hívások segítségével szolgáltatja. Az értékelés végeredménye pedig egy letölthető Pdf dokumentum lesz, amiben szerepel a kiválasztott jármű piaci értéke. Ehhez a TCPDF osztályt használtam fel. Magát a dokumentumot egy html sablon létrehozásával kezdtem, majd a sablonban szereplő paraméterek begyűjtése után rendereltem és így előállt a tényleges html, amire meghívtam a TCPDF osztály ilyenkor szokásos metódusait és beállításait. Mivel UTF-8 kódolást használtam és magyar ékezeteket, ezért a freeserif fontot állítottam be, viszont így a dokumentum előállítása 30 vagy akár 35 másodpercig is eltartott, ami nagyon hosszú idő. A fontok módosításával jobb időt értem el, ezért a sejtésem beigazolódott, hogy itt lehet valami baj. Az ékezeteket viszont a freeserif fonttal tudtam megjeleníteni. Mivel nem akartam új fontokat létrehozni és keresgélni, ezért más megoldáshoz nyúltam és a következő módosításokat végeztem.

Megoldás:

Egy Joomla fórumban osztották meg a következő ötletet, amit én is felhasználtam és jelentős gyorsulást értem el vele. Ami eddig 34 másodpercbe került az most legfeljebb 2 másodpercig tart. A megoldás lényege, hogy a legenerált lassú részt vagyis az UTF karakterek egy részhalmazát lementi egy ideiglenes fájlként, amit a TCPDF később fel tud használni.

A lassulást okozó rész:

$font = $this->_getTrueTypeFontSubset($font, $subsetchars);

amit a következővel helyettesítve jelentős sebességnövekedést érhetünk el:

if (!file_exists($fontfile.'.cached')){
       $subsetchars = array_fill(0, 512, true);
       $font = $this->_getTrueTypeFontSubset($font, $subsetchars);
       $fp=fopen($fontfile.'.cached','w');
       $flat_array = serialize($font);
       fwrite($fp,$flat_array);
       fclose($fp);
}
else {
       $fp=fopen($fontfile.'.cached','r');
       $flat_array = fread($fp,filesize($fontfile.'.cached'));
       fclose($fp);
       $font = unserialize($flat_array);
}

Megjegyzés:

Ez nem más, mint egy TCPDF hack, ami gyakorlatilag nem egy szép és tiszta módszer. Ha lehet és nem muszáj, kerüljük az ilyet megoldásokat ! Ebben az esetben viszont sajnos szükségem volt rá.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter


A bejegyzés kategóriája:Programozás and tagged . Vedd fel a kedvencek közé: link. Szólj hozzá vagy hagyj egy trackback-et:Trackback URL.

Szólj hozzá

Hozzászólás küldéséhez Be kell jelentkezni