PHP: PDF tabulky pomocí mPDF

Zvykl jsem si v PHP aplikacích používat knihovnu mPDF. Umí vytvářet PDF soubory z HTML šablon, takže člověk nemusí ručně kreslit každou čáru, řešit zalamování textu apod.

Tato velká výhoda je pochopitelně doprovázena i růnými nevýhodami: mPDF je docela moloch a navíc náročný na RAM. Některé části knihovny se sice dají vyházet, ne všechny problémy to však řeší.

Nyní jsem řešil problém v aplikaci, kdy zákazník potřebuje tisknout několikastránkové tabulkové přehledy v PDF. Server měl limit RAM použité na PHP skript (memory_limit) původně 32 MB, posléze 64 MB a i to už v některých případech nestačilo. S řešením požádat hosting o další navýšení jsem se nechtěl spokojit, proto jsem začal hledat možnosti optimalizace. Upgradoval jsem mPDF ze staré verze 4.něco na nejnovější 5.2. Z hlediska RAM to však nepomohlo, spíš naopak. Generovaná PDF se však zmenšila na zhruba třetinu původní velikosti, což je fajn.

Dle dostupných rad, jsem měl zapnuté nastavení mPDF->packTableData. Generování desetistránkové tabulky s okraji kolem elementů <td> zabralo 128 MB RAM. Okraje patrně žerou paměti fakt hodně, jejich vypnutí v CSS mělo za následek pokles potřebné RAM na 44 MB (!).

Experimentoval jsem dál – vypnutí nastavení mPDF->packTableData paradoxně spotřebu RAM snížilo na 21 MB (ač by dle dokumentace mělo způsobit opak – dalo by se tedy říci, že s tímto nastavením je mPDF sice pomalejší, ale zato zabere víc paměti).

Samozřejmě netvrdím, že vypnutí mPDF->packTableData vždy pomůže (u okrajů si tím skoro jist jsem) – pro konkrétní situaci tedy doporučuji zjistit velikost využité RAM pomocí XdebugFunction Traces.

Reagovat