MASARYKOVA UNIVERZITA FAKULTA INFORMATIKY }w!"#$%&'()+,-./012345<ya Dynamické generování PDF v prostředí webového prohlížeče BAKALÁŘSKÁ PRÁCE Štěpán Kotek Brno, jaro 2011
Prohlášení Prohlašuji, že tato bakalářská práce je mým původním autorským dílem, které jsem vypracoval samostatně. Všechny zdroje, prameny a literaturu, které jsem při vypracování používal nebo z nich čerpal, v práci řádně cituji s uvedením úplného odkazu na příslušný zdroj. Štěpán Kotek Vedoucí práce: doc. RNDr. Petr Sojka PhD. ii
Shrnutí S rozšířením internetového připojení v domácnostech i v mobilních zařízeních dochází k rozmachu aplikací spouštěných přímo v internetovém prohlížeči. Prohlížeč není pouhým nástrojem pro zobrazovaní informací, ale stává se také platformou pro webové aplikace. Nároky vývojářů na prohlížeč v některých oblastech mohou spíše připomínat nároky na operační systém. Tato práce si klade za cíl zmapovat způsoby předávání PDF souborů uživateli za použití prohlížeče a překlenout případné mezery mezi prohlížečem a operačním systémem bez obtěžování uživatele. iii
Klíčová slova PDF, webový prohlížeč, JavaScript, webová aplikace, jspdf iv
Obsah Úvod.................................. 2 1 Způsoby tvorby PDF souborů v prostředí webu....... 3 1.1 Tvorba PDF na webovém serveru............. 3 1.1.1 PHP......................... 3 1.1.2 Python........................ 5 1.1.3 Java.......................... 5 A Vytváření dokumentu pomocí FPDF.............. 7 1
Úvod Práce se skládá z několika hlavních částí. První část se zabývá srovnáním současných přístupů tvorby předávání PDF souborů v prostředí webu. V potaz jsou brány hlavně prvky dostupné ve výsledném PDF souboru, snadnost použití pro programátora a případnou činnost uživatele při tvorbě PDF souborů (typicky PDF tiskárny). Záměřením dalších částí je knihovna jspdf, která nabízí JavaScriptové rozhraní pro tvorbu PDF souborů, možnosti jejího rozšiřování a její uplatnění v praxi. 2
1 Způsoby tvorby PDF souborů v prostředí webu 1.1 Tvorba PDF na webovém serveru Vytváření souborů PDF přímo na serveru patří bezesporu mezi nejpopulárnější způsob generování PDF ve webových aplikacích. Na vlastním serveru má uživatel obvykle úplnou kontrolu nad komponentami, které se do tvorby zapojují i nad vlastním tvorbou. Mimo populárnosti je výhodné použit jej zejména v situacích, kdy stejný soubor je předáván více uživatelům, nebo kdy před předáním uživateli dochází k operacím se souborem (např. katalogizace, odeslání e-mailem, digitální podepsání). Jelikož cílem zájmu je webový server, v této kapitole bude rozebrána tvorba PDF v nejpopulárnějších programovacích jazycích pro web. 1.1.1 PHP PHP jednoznačně patří mezi nejpopulárnější jazyky v oblasti malých a středně velkých webových aplikací. K jeho velké popularitě v České republice přispívá zejména široká komunita a dostupnost u webových hostingů. Obvykle je používán s http serverem Apache. FPDF FPDF je knihovna pro tvorbu PDF napsaná jazyce PHP. Jako taková umožňuje tomuto jazyku práci s formátem PDF bez nutnosti volání externích komponent. To může být oceněno hlavně v případě internetových portálů běžících na pronajatém nebo propůjčeném hostingu, kde kromě běhového prostředí není dostupná další podpora. Tomu odpovídá i přístup autorů, kteří nabízejí knihovnu pro volné užití i u komerčních projektů. Protože se dokument vytváří přímo interpretem jazyka a ne externí komponentou, je reprezentován objektem knihovní třídy. Jeho úprava, vkládání nových prvků a i vytvoření jsou řízené voláním metod tohoto objektu. 3
1. ZPŮSOBY TVORBY PDF SOUBORŮ V PROSTŘEDÍ WEBU Pro PHP jako skriptovací jazyk je náročné pracovat s fonty přímo, proto se používá vlastní formát 1 Konkrétní font je omezen kódováním, proto pro podporu více kódování je potřeba mít definovaný zvlášt font pro každé kódování. Řešením v takovém případě může být také projekt TFPDF 2, který má za cíl rozšířit knihovnu FPDF o podporu unicode. Základem pro vkládání textu je metoda MultiCell. Pro text obstarává zalomení nového řádku a rozdělení textu na více stránek, pokud jsou potřebné. Vypočítává také umístění textu na stránce dokumentu vzhledem k předcházejícímu textu. Pro samotné vkládání bloků s textem je pak používána metoda Cell, která přebírá text a souřadnice s absolutní polohou. Pro uživatele může tato metoda mít využití například při tvorbě hlavičky a zápatí. Obrázky se do souboru přidávají jako samostatný plovoucí objekt, nepozicují se tedy podle existujícího textu na stránce, ale při vložení se předávají souřadnice absolutní polohy na aktuální stránce. Tento vztah je oboustranný tj. pokud uživatel chce pod obrázek vložit text pomocí MultiCell musí nejdříve definovat vertikální mezeru od předchozího odstavce. Při tvorbě dokumentu se binární kód obrázku převádí do base64. Podporované formáty obrázků jsou GIF, PNG a JPG. Vhodné nasazení FPDF jako nástroje na generovaní PDF souborů je hlavně na menších webových projektech a freehostingových serverech, kde uživatel nemá kontrolu nad instalovanými komponentami a potřebuje generování souboru za běhu. Podmínkou je běhové prostředí PHP 4.3.10 nebo vyšší. Hlavní výhodou je snadnost použití a šíře podporovaných prvků, mezi nevýhody lze počítat absence snadného způsobu sazby matematických výrazů a mírně zvýšené výpočetní nároky. Způsob práce s knihovnou FPDF dokumentu je dále rozveden na příkladu v příloze A. 1. Pro fonty ve formátu TrueType a Type1 existují konvertory. 2. Dostupné online: http://www.fpdf.org/en/script/script92.php 4
1. ZPŮSOBY TVORBY PDF SOUBORŮ V PROSTŘEDÍ WEBU TCPDF Knihovna TCPDF je dodávána pod licencí GNU LGPL v3. Podobně jako FPDF je dokument reprezentován objektem knihovní třídy a jeho obsah je nastavován voláním metod objektu. Metody jsou obecně propracovanější než v knihovně FPDF. Je zde patrné rozlišení nastavení okrajů, fontů a podobných vlastností pro jednotlivé sekce dokumentu (titulní stranka, nadpisy, záhlaví). Pro generování souborů s fonty z TrueType se používá php skript, přiložený ke zdrojovým souborům knihovny. 1.1.2 Python Python je oblíbený zejména pro svou jednoduchost a přímost. Pro programování webových stránek je používaný zejména u větších projektů. peepdf peepdf je dodáván pod licencí GNU GPL v3. Přísně vzato nejde o knihovnu, ale o nástroj pro manipulaci s PDF, přestože její části mohou být použity jako knihovna. pypdf Knihovna pypdf je dodávána pod upravenou licencí BSD. Knihovna bohužel neumožňuje vytvoření nového pdf pouze manipulaci se stránkami exitujícího. Umožňuje také čtení metadat (tvůrce dokumentu, název apod.). 1.1.3 Java Java na webu je oblíbena zejména u masivních aplikací, kde je velký požadavek na bezpečnost, rychlost a stabilitu (např: bankovní systémy) 5
1. ZPŮSOBY TVORBY PDF SOUBORŮ V PROSTŘEDÍ WEBU PDFBox Apache PDFBox je otevřená knihovna distribuovana pod licencí Apeche 2.0. Poskytuje Javě pokročilé rozhraní pro práci s PDF soubory. 6
A Vytváření dokumentu pomocí FPDF Pro demonstraci poslouží část článku Porovnání T-Mobile MDA II vs. Eurotel Dataphone II 1. Na začátek je nutné vybrat kódování dokumentu, a nadefinovat cestu k souborům s fonty 2. Toho je možné docílit pomocí definování hlavičky a konstantou FPDF_FONTPATH. Při inicializaci objektu dokumentu je také potřeba nastavit fonty, co chceme použít s odkazem na soubor s fontem. Toto se týka použitých řezů. header("content-type","application/pdf; charset=windows-1250"); define("fpdf_fontpath","./font/"); class PDF extends FPDF { function construct() { parent:: construct(); $this->addfont("times-cp1250", "", "times-cp1250.php"); $this->addfont("times-cp1250", "B", "timesb-cp1250.php"); $this->addfont("times-cp1250", "I", "timesi-cp1250.php"); $this->addfont("times-cp1250", "BI", "timesbi-cp1250.php"); } Definovat zápatí je možné vytvořením potomka s definovanou metodou Footer. V zápatí může být například číslo stránky. function Footer() { $this->sety(-15); $this->setfont("times-cp1250","",8); $this->cell(0,10,$this->pageno()."/{nb}",0,0,"c"); } K usnadnění práce je možné definovat další metody pro nejčastěji použité prvky. V článku se dále používá tabulka, číslovaný seznam a odstavce s nadpisem i bez nadpisu. Pro jednoduchost jsou uvedeny pouze hlavičky 3 odpovídajících metod. function Section($text, $title=null) function BasicTable($header,$data) function NumericList($items) 1. Dostupné online: http://www.ce4you.cz/articles/detail.asp?p= 0&a=1 nebo v přiloženém archivu fpdf.zip/art 2. Na adrese http://fpdf.fruit-lab.de/ je možné získat soubory s fontem v požadovaném kódování. Podmínkou je vlastnění původního TrueType fontu jako základ pro konverzi. Pokud je požadovaná podpora více řezů písma je potřeba zkonvertovat i odpovídající varianty fontu. 3. Těla metod je možné nalézt v přiloženém souboru fpdf.zip/index.php 7
ˇ A. V YTVÁ RENÍ DOKUMENTU POMOCÍ FPDF V této fázi je možné zaˇcít se vkládáním vlastního obsahu. Opˇet pro zjednodušení zde bude pouze jednoduchá ukázka ze cˇ lanku s použitím každého prvku ve vzájemném kontextu4. $pdf = new PDF(); $pdf->aliasnbpages(); $pdf->addpage(); $pdf->section("co se vzhledu týká, zde již narazíme na první drobné...", "Vzhled"); $pdf->image("img/img1.jpg",11.4,27,20,0); $pdf->ln(19); $pdf->basictable( array("pocket PC","Rozmˇ ery (mm)","hmotnost (g)"), array( array("eurotel Dataphone II","70 x 130 x 19","185"), array("t-mobile MDA II","70 x 130 x 19","185") ) ); $pdf->numericlist(array( "MDA II má již v ROMce instalován poslední balík oprav a vylepšení...", "Na MDA II je pˇ rímo v ROMce uložena instalace lokalizace, uživatel...", "Kromˇ e standardních aplikací obsahuje MDA II pˇ rímo v ROMce vynikaj..." )); $pdf->output(); Vzhled Co se vzhledu týká, zde již narazíme na první drobné rozdíly, i když z praktického hlediska se jedná skutečně jen o prkotiny. Celé tělo přístroje je v obou případech stříbrné, liší se akorát v části přední strany zařízení barvou a tvarem tlačítek. Hmotnost je také až na nějaký ten gram stejná. Nemá smysl to popisovat slovně, prohlédněte si fotografii. Na jiné rozdíly jsem již nenarazil, samozřejmě pomíjím absenci grafických prvků konkurenční společnosti na každém ze zařízení:) Pocket PC Rozměry (mm) Hmotnost (g) Eurotel Dataphone II T-Mobile MDA II 70 x 130 x 19 70 x 130 x 19 185 185 1. MDA II má již v ROMce instalován poslední balík oprav a vylepšení známý pod názvem AKU1, který opravuje řadu více či méně závažných problémů, zvyšuje stabilitu a funkčnost, snižuje počet běžících procesů (vysvětlení zde) atp. Kdy bude tato oprava dostupná i pro Dataphone II se zatím neví... 2. Na MDA II je přímo v ROMce uloženo nastavení všech služeb T-Mobile, které se automaticky instalují po tvrdém resetu; u Dataphone II je nutné je instalovat ručně z CD (instalace z ROM se teprve přípravuje). 3. Na MDA II je přímo v ROMce uložena instalace lokalizace, uživatel si může vybrat, zda instalovat velkou, malou či žádnou; Dataphone II ji má opět pouze na CD (instalace z ROM se teprve přípravuje). 4. Kromě standardních aplikací obsahuje MDA II přímo v ROMce vynikající aplikaci pro sledování nákladů GPRS spojení Spb GPRS Monitor, prohlížeč prezentací a PDF souborů CueVue Presenter a CueVue PDF Viewer. 1/1 4. Celý dokument i kód, který jej vygeneroval lze nalézt v pˇriloženém archivu fpdf.zip 8
Literatura [1] Manuál FPDF [online]. Dostupné z WWW: <http://fpdf. org/en/doc> [2] TCPDF examples [online]. Dostupné z WWW: <http://www. tcpdf.org/examples.php [3] Document management Portable document format Part 1: PDF 1.7 [online, pdf] last updated: 2008-7-1 [cit. 2011-05-26]. Dostupné z WWW: <http://www.adobe.com/content/dam/ Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf> 9