UNIVERZITET U NIŠU PRIRODNO MATEMATIČKI FAKULTET …unarske... · kao u drugim programskim...

44
UNIVERZITET U NIŠU PRIRODNO MATEMATIČKI FAKULTET DEPARTMAN ZA RAČUNARSKE NAUKE KREIRANJE DOCX I ODT DOKUMENATA U PROGRAMSKOM JEZIKU PHP - MASTER RAD - Mentor : Student : Prof. Dr Marko Milošević Petar Ristović Niš, 2016.

Transcript of UNIVERZITET U NIŠU PRIRODNO MATEMATIČKI FAKULTET …unarske... · kao u drugim programskim...

UNIVERZITET U NIŠU

PRIRODNO MATEMATIČKI FAKULTET

DEPARTMAN ZA RAČUNARSKE NAUKE

KREIRANJE DOCX I ODT DOKUMENATA U PROGRAMSKOM

JEZIKU PHP

- MASTER RAD -

Mentor : Student :

Prof. Dr Marko Milošević Petar Ristović

Niš, 2016.

1

Predgovor

Ovaj rad je nastao kao posledica generisanja tekstualnih izveštaja u programskom

jeziku PHP, te mnogobrojnih problema u generisanju dokumenata sa odt ekstenzijom. Moja

primarna sfera interesovanja je veb programiranje, i razvoj veb aplikacija, pa mi je tema

ovog rada u potpunosti odgovarala.

Zahvaljujem se svom mentoru prof. dr Marku Miloševiću, koji mi je pokazao značaj

objektno-orijentisanog programiranja kroz nekoliko predmeta, a na posletku putem veb

programiranja definitivno usmerio moje dalje usavršavanje u kreiranju veb aplikacija.

Najveću zahvalnost dugujem mr Ivanu Stankoviću, koji je samo svojom dobrom

voljom izdvajao vreme kako bi me uveo u svet veb programiranja i korišćenje Zend

okruţenja, u kojem je inače i nastala aplikacija koja prikazuje mogućnosti klase PHPWord.

Tako je mr Ivan Stanković od đaka koji je došao iz Medicinske škole, bez ikakvog znanja o

programiranju, napravio studenta koji moţe samostalno da kreira, u najmanju ruku solidne

veb aplikacije, i što je najvaţnije, da samostalno nastavi učenje i usavršavanje.

Zahvaljujem se i prof. Dr Milanu Tasiću, koji me je naučio osnovama i naprednim

tehnikama u radu sa MySQL bazama podataka, i koji je uvek ukazivao na greške u radu, i

probleme koji postoje u praksi, u radu sa realnim klijentima.

2

Sadržaj :

1 Uvod ................................................................................................................................................ 3

2 Uvod u PHP .................................................................................................................................. 4

2.1 Istorija .................................................................................................................................... 4

2.2 PHP 4.0 .................................................................................................................................. 5

2.3 PHP 5.0 .................................................................................................................................. 6

2.4 Generalne karakteristike jezika .......................................................................................... 7

3 MVC (Model View Controller) arhitektura ........................................................................ 9

3.1 Šta je MVC arhitektura ....................................................................................................... 9

3.2 Popularna MVC okruţenja ............................................................................................... 10

3.3 Osnovne karakteristike Zend okruţenja .......................................................................... 11

4 Struktura dokumenata sa ekstenzijom docx ....................................................................... 13

4.1 Uvod u XML (Extensible Markup Language) ................................................................. 13

4.2 Office Open XML format .................................................................................................. 14

4.3 Ključni delovi dokumenta ................................................................................................. 16

5 Struktura dokumenata sa ekstenzijom odt ......................................................................... 19

5.1 Open Document format ....................................................................................................... 19

5.2 Ključni delovi ODT dokumenta ......................................................................................... 21

5.2.1 Settings.xml ................................................................................................................... 21

5.2.2 Meta.xml ........................................................................................................................ 22

5.2.3 Styles.xml ...................................................................................................................... 23

5.2.4 Content.xml ................................................................................................................... 24

6 Rad sa XML-om u PHP-u ...................................................................................................... 26

7 Postojeća klasa PHPWord i napravljene izmene ............................................................... 28

7.1 Opis postojeće klase PHPWord .......................................................................................... 28

7.2 Izmene postojeće klase PHPWord ..................................................................................... 31

8 Zaključak .................................................................................................................................... 40

Literatura ....................................................................................................................................... 41

Kreiranje docx i odt dokumenata u programskom jeziku PHP

3

Glava 1

Uvod

Svaka iole sloţena veb aplikacija sadrţi u sebi modul za kreiranje izveštaja, pri

čemu se najčešće koriste excel, pdf, i word izveštaji. Postoji mnogo dostupnih, besplatnih

biblioteka koje omogućuju kreiranje takvih izveštaja, od kojih su najpoznatije: PHPWord,

za kreiranje docx i odt dokumenata, TCPDF, za kreiranje pdf dokumenata i PHPExcel, za

kreiranje izveštaja u Excel-u. Svaka od navedenih biblioteka omogućava kreiranje sloţenih

word, openoffice, excel dokumenata. Medjutim, postoje i neke mane, najčešće kada se radi

o fleksibilnosti. Kao što je poznato, Microsoft Word nije jedini softver za procesiranje

teksta, pa se dosta korisnika odluči za neke alternative kao što su OpenOffice, KingOffice,

LibreOffice. Postoje biblioteke za rad i sa openoffice dokumentima, medjutim, glavni

nedostatak je nemogućnost kreiranja dokumenta u oba formata (docx i odt), pomoću iste

biblioteke. Ţeljeni sadrţaj dokumenta potrebno je kodirati posebno za svaki format.

Biblioteka PHPWord jedina pruţa kreiranje istih dokumenata po sadrţaju, a

različitih ekstenzija. Ideja je jako dobra, klasa je tek u začetku, tako da ne daje mnogo

mogućnosti za rad sa odt formatom. Mnogo je bolja podrška za rad sa docx fajlovima, iz

prostog razloga što se Word mnogo češće koristi od OpenOficce-a, ili LibreOffice-a.

Postoje elementi koje odt fajlovi u startu ne podrţavaju (vertikalno pozicioniran tekst u

okviru ćelije tabele itd.) pa samim tim ne mogu biti ni implementirani u okviru biblioteke.

Cilj je da se biblioteka unapredi, da korisnik moţe da kreira dokument sa svim osnovnim

elementima (stilovima fonta, paragrafa, nabrajanjima, listama na više nivoa, običnim i

stilizovanim tabelama, podešavanjima na nivou celog dokumenta itd.) pomoću istih metoda

i za docx i za odt dokumente.

Za izmenu postojeće biblioteke PHPWord potrebno je poznavanje programskog

jezika PHP. Tekstualni dokumenti su u osnovi kompresovani folderi (ZIP paketi), pa je

potrebno opisati strukturu fajlova koji se nalaze unutar paketa. Oba formata koriste XML

fajlove za čuvanje podataka, te je potrebno najpre predstaviti XML kao programski jezik.

Najvaţnije je prikazati mogućnosti biblioteke pre, i posle izmena obuhvaćenih ovim radom,

kao i smernice za eventualni dalji rad.

Kreiranje docx i odt dokumenata u programskom jeziku PHP

4

Glava 2

Uvod u PHP

PHP (Hypertext Preprocesor) je serverski interpreterski programski jezik koji sluţi

za dinamičko generisanje HTML koda. Drugim rečima, PHP je skript jezik koji sluţi za

kreiranje HTML stranica na serveru. Korišćenjem ovog načina generisanja sadrţaja, klijent

ne moţe videti kod koji je generisao sadrţaj koji gleda, već ima pristup čistoj HTML

stranici.

2.1 Istorija

Počeci PHP-a datiraju iz 1995. godine, kada je programer sa Grenlanda, Rasmus

Lerdorf, napisao Perl/CGI skriptu koja omogućuje da vidi koliko posetilaca čita njegov

onlajn rezime. Njegova skripta ima dva zadatka: upisuje podatke o korisniku, i prikazuje

broj posetilaca internet stranice. Internet u to vreme nije bio dovoljno razvijen, pa ovakvi

alati nisu ni postojali (Webmaster tools). Zbog toga Rasmus počinje da deli besplatno alat

koji je kreirao, i naziva ga Personal Home Page (PHP).

Lerdorf nastavlja da razvija alat, i jedna od najvećih promena je uvođenje opcije za

konvertovanje podataka unetih preko HTML forme u simboličke promenljive, koje

omogućuju eksportovanje u druge sisteme. Razvoj PHP-a kulminira u Novembru 1997.

godine izlaskom verzije PHP 2.0, koja dobija naziv PHP-FI (PHP-Form Interpreter). Od

ove verzije, PHP počinje da liči na pravi programski jezik. Ugrađena je podrška za DBM,

mSQL i Postgres95 baze podataka, kolačiće itd. Do Juna 1998. godine više od 50 000

programera koristi PHP da unapredi svoje internet stranice. Na početku 1999. godine

pojavljuje se podatak da broj korisnika PHP-a prelazi jedan milion, tako da je PHP postaje

najpopularniji skript jezik na svetu. Ubrzo posle toga, dva programera iz tima za razvoj,

Zeev Suraski i Andi Gutmans, uviđaju mane trenutne verzije, jer PHP-FI ne omogućava

kreiranje sloţene eCommerce aplikacije (fakultetski projekat). Sa novim idejama, kreiraju

PHP parser, koji ujedno označava i izlazak nove verzije, PHP 3.0.

Kreiranje docx i odt dokumenata u programskom jeziku PHP

5

2.2 PHP 4.0

PHP 4.0 je izlazi 22. Maja 2000. godine. Samo par meseci kasnije, Netcraft

objavljuje podatak da je PHP 4.0 instaliran na više od 3.6 miliona internet domena. Ova

verzija sadrţi ogroman broj novih funkcija, od kojih su najvaţnije sledeće:

UnapreĎeno upravljanje resursima - Najveća mana ranijih verzija je skalabilnost.

Razlog toga je najviše što programeri nisu predvideli da će PHP postati toliko

popularan, i da će se koristiti za aplikacije tolikog obima. Posle neuspešnih pokušaja

preispitana je čitava logika PHP-a. Rezultat toga je značajno unapređeno

upravljanje resursima u verziji 4.0.

Objektno-orijentisana funkcionalnost - Nove mogućnosti privlače nove korisnike

koji su navikli da rade sa objektno-orijentisanim jezicima (OOP). Omogućene su

nove metodologije koje uključuju generalni koncept klase i objekta.

UnapreĎeno upravljanje sesijom – Upravljanje HTTP sesijom u verzijama 3.x

vrši se posredno, preko paketa PHPLIB koji se naknadno skida, pa je taj paket

direktno dodat u verziji 4.0. Ovo je doprinosi neuporedivo efikasnijem praćenju

korisnikovih aktivnosti.

Enkripcija – Dodata je biblioteka Mcrypt, nudeći korisnicima kompletnu i heš

enkripciju koristeći algoritme Blowfish, MD5, TripleDES između ostalih.

ISAPI (Internet Server Application Programming Interface) podrška –

Omogućeno je korišćenje PHP-a u kombinaciji sa Microsoft-ovim IIS (Internet

Information Service) Web serverom, što doprinosi mnogostruko boljim

performansama i boljoj sigurnosti.

COM (Component Object Model) podrška – Još jedan vid bonusa za korisnike

Windows-a, koji dobijaju mogućnost da instanciraju i pristupaju COM objektima.

Ova funkcija poboljšava podršku za rad sa Windows aplikacijama.

Podrška za Javu – Omogućeno je povezivanje sa Java objektima iz PHP aplikacija,

što doprinosi boljoj interoperabilnosti PHP-a (Java je “platform independent“).

Dodata PCRE (Perl Compatible Regular Expressions) biblioteka – Perl se smatra

kraljem svih programskih jezika u kontekstu parsiranja stringova. Programeri iz

tima za razvoj su znali da je ključ za još širu prihvaćenost PHP-a dodavanje moćnih

funkcija za rad sa regularnim izrazima, pa odlučuju da jednostavno iskoriste već

postojeću funkcionalnost jezika Perl. Od verzije 4.2.0 PCRE biblioteka dolazi

zajedno sa PHP-om.

Kreiranje docx i odt dokumenata u programskom jeziku PHP

6

Izlazak verzije PHP 4.0 dovodi funkcionalnost jezika do veoma ozbiljnog nivoa.

Unapređenjem skalabilnosti PHP postaje zanimljiv i široko korišćen i u aplikacijama

velikog obima, i jezik je dostigao neki svoj vrhunac tih godina. Kako programeri stalno

traţe nova poboljšanja, ubrzo počinje rad na istorijskom zadatku, PHP 5.0.

2.3 PHP 5.0

Verzija PHP 5.0 je još jedan stepenik u razvoju jezika PHP. Prethodne verzije imaju

moţda veći broj dodatih biblioteka, ali verzija 5.0 donosi poboljšanje već postojeće

funkcionalnosti, pribliţavajući PHP strukturalno ozbiljnijim kompajlerskim programskim

jezicima. Glavne prednosti nove verzije bile su:

Značajno bolja objektno-orijentisana funkcionalnost – Ovo je moţda

najupečatljivija razlika u odnosu na prethodne verzije. Verzija 5.0 sadrţi brojne

funkcionalne dodatke kao što su eksplicitni konstruktori i destruktori, kloniranje

objekata, apstraktne klase, interfejsi, a značajno je poboljšano upravljanje

objektima.

Try/catch upravljanje izuzecima – Verzija 5.0 podrţava upravljanje izuzecima, i

kao u drugim programskim jezicima kao što su C++, C# i Java, pruţa odličan oblik

standardizacije logike obrade grešaka.

Poboljšan rad sa stringovima – Prethodne verzije tretiraju stringove kao nizove,

što je direktna posledica slabe tipiziranosti jezika. Ova strategija je u verziji 5.0

promenjena tako što je uvedena sintaksa specijalizovanog ofseta stringova

(karakteru se pristupa sa $str[$position]), dok je ranija sintaksa prevaziđena.

Poboljšana podrška za XML i Web servise – Podrška za XML se sada bazira na

libxml2 biblioteci, i uvedena je nova ekstenzija za parsiranje i manipulaciju

XML-om nazvana SimpleXML. Dodata je ekstenzija SOAP (Simple Object Access

Protocol) koja definiše pravila vezana za strukturu zahteva (request).

2.4 Generalne karakteristike jezika

Svaki programer ima neke svoje razloge zbog kojih koristi PHP, ali generalno

glavne prednosti ovog jezika su: praktičnost, moć, mogućnosti i cena.

Od samog početka, PHP je kreiran tako da prvenstveno bude praktičan. Ideja

Rasmusa Lerdorfa nije da kreira novi programski jezik, već da reši problem za koji u to

vreme, rešenje nije postojalo. Štaviše, u daljem radu on ne pokušava da unapredi sam jezik,

Kreiranje docx i odt dokumenata u programskom jeziku PHP

7

već da poveća broj funkcija koje nudi korisniku. Sve to je rezultovalo minimalističkim

programskim jezikom. Za početnike, kompletna PHP skripta moţe da se sastoji od samo

jedne linije koda, za razliku od C-a, i nema potrebe za uključivanjem dodatnih biblioteka.

Na primer, sledeća linija koda koja štampa trenutni datum u formatu Septembar 23, 2005,

predstavlja kompletnu PHP skriptu:

<?php echo date("F j, Y"); ?>

PHP je slabo tipiziran jezik, što znači da nema potrebe za kreiranjem, uništavanjem,

menjanjem tipa promenljive. PHP upravlja takvim stvarima interno, kreirajući promenljive

po njihovom pozivu u skriptama. Za dodelu tipa promenljivoj, koristi se formula

najpogodnijeg izbora. Na primer, PHP smatra sledeći skup naredaba potpuno validnim:

<?php

$number = "5"; # $number je string

$sum = 15 + $number; # saberi broj i string, rezultat

je broj

$sum = "twenty"; # Presnimi vrednost novim stringom.

?>

Uništavanje promenljivih takođe vrši PHP, tako da se resursi vraćaju sistemu po

izvršenju skripte. Evo i nekih dodatnih mogućnosti koje PHP pruţa:

Kreiranje i manipulacija Macromedia Flash objektima, slikama i PDF fajlovima.

Procena sloţenosti šifre, odnosno da li je, i koliko šifra podloţna otkrivanju

jednostavnim šablonima i poređenjima sa rečnicima.

Komunikacija sa LDAP-om (Lightweight Directory Access Protocol), pomoću koga

se prepoznaju uređaji i fajlovi u okviru mreţe, bilo da je to internet, ili intranet.

Parsiranje najsloţenijih stringova korišćnjem POSIX (Portable Operating System

Interface) biblioteka i biblioteka inkorporiranih direktno iz Perl-a.

Autentikacija korisnika čije se poverljive informacije nalaze u običnim fajlovima,

bazama podataka, ili čak Microsoft Active direktorijumima (specifične baze

podataka velikog obima koje su prevashodno namenjene za pretragu i čitanje

podataka).

Komunikacija sa nizom različitih sistema za procesiranje kreditnih kartica

Jedna od najvećih prednosti je fleksibilnost samog jezika. PHP ima podršku za niz

različitih alata od kojih su neki: Adabas D, dBase, Empress, FilePro, FrontBase,

Kreiranje docx i odt dokumenata u programskom jeziku PHP

8

HyperWave, Informix, Interbase, mSQL, MySQL i Oracle. Ono što je uvek bitno kod svih

tehnologija jeste cena, a po tome je PHP idealan jezik, jer se vodi kao open source softver,

pa zajedno sa servisima kao što su Sendmail, Bind, Apache, dominira internet trţištem.

Korisnici su oslobođeni obaveza oko licenciranja. Dobrodošlo je učešće programera iz svih

delova sveta koji ţele da se pridruţe timu za dalji razvoj PHP –a. Na ovaj način dobija se

nepresušan izvor talenata koji doprinose svakodnevnom unapređivanju funkcionalnosti

jezika.

Kreiranje docx i odt dokumenata u programskom jeziku PHP

9

Glava 3

MVC (Model View Controller) arhitektura

Dizajniranje dobrog softvera je teţak zadatak, treba se prilagoditi softveru koji se

trenutno dizajnira, a ujedno se treba obezbediti i dobra generalizacija za lakšu

implementaciju novih funkcionalnosti u budućnosti. Za takav posao korisni su strukturalni

šabloni. Cristopher Alexander prvi opisuje način na koji bi šabloni mogli da se koriste u

dizajniranju softvera. On kaţe da svaki šablon predstavlja jedan problem koji se stalno

ponavlja tokom vremena, i opisuje strukturu rešenja koje bi se koristilo svaki put kada se taj

problem javi.

3.1 Šta je MVC arhitektura?

MVC je šablon u dizajnu softvera, zasnovan na povezanosti tri osnovne komponente jezika

kao što je PHP, koji se temelji na paradigmama objektno-orijentisanog programiranja. Te

komponente su Model, View i Controller.

Model čuva svu logiku aplikacije. To moţe biti način na koji aplikacija čuva

podatke, ili koristi pakete treće strane, sa ciljem da obezbedi specifičnu funkcionalnost

same aplikacije. Ako aplikacija pristupa bazi podataka, kod za pristup bi se nalazio u

modelu, bilo da se radi o čitanju ili upisu podataka.

View je mesto gde se čuvaju delovi korisničkog interfejsa. Tu spadaju HTML, CSS,

i Javascript fajlovi. Sve što korisnik vidi i sa čime moţe da interaguje, smešteno je unutar

View-a, a često se koristi i kombinacija nekoliko View-a unutar istog zahteva.

Controller je komponenta koja povezuje Model i View. Controller izoluje logiku

Model-a aplikacije od elemenata korisničkog interfejsa, i određuje način na koji aplikacija

obrađuje korisničke akcije. Zahtev se najpre šalje kontroleru, koji dalje instancira Model-e i

View-ove potrebne za obradu zahteva.

Slika 3.1.1- Način interakcije korisnika i aplikacije

Kreiranje docx i odt dokumenata u programskom jeziku PHP

10

Controller ne mora uvek da intancira Model-e i View-ove, jer zahtev moţe da

podrazumeva samo menjanje stanja aplikacije, ili preuzimanje neparsiranih podataka od

treće strane. Procesom rutiranja se, u odnosu na zahtevani URL, određuje da li će biti

intanciranja, ili ne.

Postoji mnogo aspekata jedne sloţene aplikacije, od kojih je svaki podjednako

bitan:

Dizajn, koji direktno utiče na zainteresovanost potencijalnog korisnika za

aplikaciju.

Logika aplikacije koja treba da omogući praktičnu implementaciju sloţenih

zahteva.

Neprekidni proces unapređivanja aplikacije, ispravljanja grešaka i

generalnog odrţavanja aplikacije.

...

U nestrukturiranim aplikacijama, ovi zadaci nisu jasno podeljeni, pa promena na

jednom delu aplikacije moţe da utiče na sve ostale delove, što nije dobra praksa, i oteţava

posao programeru. Tu se javlja potreba za šablonima, u ovom slučaju za MVC šablonom.

MVC šablon jasno definiše koji deo koda se odnosi na koji deo aplikacije (bazu podataka,

korisnički interfejs, itd.). Ako dođe do promene koda u modelu, to nikako ne moţe da

dovede do problema unutar View-a, ili Controller-a. Ako se pak dizajn aplikacije drastično

promeni, to neće uticati na funkcionalnost Model-a i Controller-a.

3.2 Popularna MVC okruženja

Postoji dosta MVC okruţenja koja implementiraju već objašnjenu arhitekturu.

Predstavljene su zajedničke osobine, i specifičnosti svakog okruţenja ponaosob.

CodeIgniter je prvo i najjednostavnije MVC okruţenje. Dizajnirano je od strane

kompanije EllisLab, i moţe se opisati kao “open source“ okruţenje koje čini osnovu

njihovog premium CMS (Content Management System) ExpressionEngine-a. Koristi se već

godinama, a opet logika okruţenja nije promenjena. Osnovne karakteristike su i dalje

odlična dokumentacija, i visok kvalitet kodiranja. Loša strana ovog okruţenja je slabija

podrška za OOP strukturu.

CakePHP je jedno od najpopularnijih okruţenja. Za razliku od prethodnih, ima

jako razvijenu zajednicu, i dobro je prihvaćeno širom sveta. Glavna karakteristika ovog

okruţenja je automatsko izvršavanje određenih akcija. Ovo je veoma neobično za većinu

programera, jer moţe doći do izvršenja neke komande koja nije predviđena, bilo da je

korisna, ili ne. Očigledno da je ovo dobra opcija ukoliko treba brzo završiti neku manju

Kreiranje docx i odt dokumenata u programskom jeziku PHP

11

aplikaciju (sa uobičajenim mogućnostima), ali ne tako dobra ako treba kreirati neku

specifičnu aplikaciju koja iskače iz šablona. Moguće je koristiti ovo okruţenje iz komandne

linije, pomoću alata Bake. Na ovaj način se moţe kreirati potpuna aplikacija za nekoliko

minuta, gde praznine i argumente koji nedostaju, zamenjuju podrazumevane vrednosti.

Zend okruţenje je dosta sloţenije od do sada pomenutih okruţenja. To je kolekcija

biblioteka kodova koja čini osnovu MVC arhitekture. Potrebno je dosta vremena da bi se

potpuno ovladalo Zend tehnologijom, iz prostog razloga što za razliku od ostalih okruţenja

koja su manjeg obima, i sadrţe samo nezaobilazne biblioteke, ovo okruţenje obuhvata

mnoštvo biblioteka koje daju podršku za korišćenje servisa i API (Application

Programming Interface)-ja treće strane.

3.3 Osnovne karakteristike Zend okruženja

Za razliku od mnogih drugih okruţenja, gde su biblioteke usko povezane, kod ovog

okruţenja biblioteke su skoro potpuno nezavisne, tako da svaka moţe da čini zasebnu

komponentu. Ovo je veoma pogodno za manje aplikacije, jer ako je za rad aplikacije na

primer potrebna samo autentikacija, moţe da se iskoristi Zend_Auth biblioteka, bez

korišćenja ostatka okruţenja. Funkcije koje su zajedničke za skoro sve aplikacije, kao što

su provera unetih podataka od strane korisnika, heširanje podataka, operacije sa XML-om i

bazama podataka, već postoje u okviru Zend-a u vidu API-ja.

Zašto je bolje koristiti Zend okruţenje, nego organizovati kod na svoj način? Neki

od osnovnih razloga su sledeći:

Standardizovana rešenja za osnovne zadatke - PHP kao jezik ne propagira neki

standard za kodiranje, pa je teško odrţati konzistentnost kod obimnih aplikacija.

Nedostatak striktnosti dozvoljava programerima da odstupaju od najbolje prakse,

što moţe dosta smanjiti sigurnost same aplikacije. Zend sa druge strane, ide u korak

sa trenutno najboljom praksom za implementaciju vaţnih funkcija, kao što su

sigurnost aplikacije, provera unetih podataka i druge, pa se korišćenjem ugrađenih

biblioteka poboljšava kvalitet vašeg koda, i smanjuje podloţnost napadima. Pored

toga, ukoliko se novi programeri priključe projektu koji je rađen u Zend-u, treba im

dosta manje vremena da se uhodaju, nego da je struktura projekta organizovana na

“svoju ruku“.

Ponovno korišćenje koda – Zend je zasnovan na paradigmama objektno

orijentisanog programiranja, smanjujući posao programerima izbegavanjem

dupliranja koda. Ovo je posebno vaţno za veb aplikacije, jer ako se javi potreba za

promenom interfejsa aplikacije, gde funkcionalnost ostaje ista, potrebno je samo

definisati novi View, ili više njih, koji na drugačiji način predstavljaju podatke

Kreiranje docx i odt dokumenata u programskom jeziku PHP

12

dobijene iz Controller-a. Nije potrebno ponovo pisati kod, i ceo proces je jako

jednostavan i transparentan.

Open source – Zend je open source projekat. Iako je sponzorisan od strane

kompanije Zend Technologies, veći deo razvoja obavlja tim volontera iz celog

sveta, koji ispravlja greške i dodaje nove funkcije. Ovo okruţenje moţe da se koristi

bez naknade za licencu, i bez kupovine skupog hardvera, ili softvera. To što je open

source znači da bilo koji programer moţe da proveri kod, predloţi bolje rešenje, i

kada se pojavi neka greška, ne prođe ni nekoliko sati, a rešenje je već tu.

Stalni rad na novim verzijama – Tim zaduţen za Zend okruţenje stalno radi na

novim verzijama, pa se dešava da mesečno izadje jedna, dve, a nekada i tri verzije.

Pored toga, postoje i verzije kandidati, koje daju neke smernice zajednici, šta mogu

da očekuju u narednom periodu.

Standard za testiranje jedinica – Kako se ovo okruţenje sastoji od skoro

nezavisnih komponenata, bitno je da postoje testovi za svaku od njih posebno. Ako

se nova komponenta uključuje u Zend okruţenje, ona mora da sadrţi testove

napisane u nekom od PHPUnit okruţenja za testiranje.

Alati za generisanje koda – Ovi alati omogućuju kreiranje jedne kompletne Zend

aplikacije uz malo truda. Generisanje koda je implementirano u vidu komandne

linije, gde se pomoću određenih naredbi, kreiraju Controller-i, View-ovi i akcije,

pored onih koje se automatski generišu kreiranjem projekta.

Operacije sa servisima treće strane – Zend sadrţi podršku za veliki broj alata i

tehnologija treće strane, uključujući AMF(Adobe Action Message Format), Google

Data Api, Dojo Toolkit, Microsoft CardSpace, veb servise sa internet sajtova

Amazon, Yahoo, Twitter, Flickr, Technorati, Delicious i mnoge druge alate. To nije

sve. Jedna od najvećih prednosti jezika PHP kroz istoriju bila je podrška za skoro

sve tipove baza podataka, tipove datoteka, i protokola. Zend okruţenje sadrţi API-je

za pristup MySQL, PostgreSQL, Oracle i Microsoft SQL Server bazama podataka

između ostalih. Pristup se vrši preko komponente Zend_Db. Moguće je slanje

mejlova SMTP, POP3, IMAP protokolima, i kreiranje veb servisa koristeći SOAP i

REST protokole, kodiranje i dekodiranje JSON (JavaScript Object Notation)

objekata, kreiranje i manipulacija PDF dokumentima.

Odlična dokumentacija – Zend okruţenje dolazi sa obimnom dokumentacijom za

više od 60 esencijalnih komponenata. Dokumentacija sadrţi vodič za programere sa

preko hiljadu strana, ubrzani kurs za iskusne programere, detaljne opise API-ja,

video i audio materijale snimljene od strane poznatih Zend inţenjera.

Kreiranje docx i odt dokumenata u programskom jeziku PHP

13

Glava 4

Struktura dokumenata sa ekstenzijom docx

Microsoft Office do verzije 2007 koristi binarni metod čuvanja sadţaja dokumenata,

sa ekstenzijom doc. U verziji 2007 dolazi do velikih promena, osnova sistema za

procesiranje teksta je XML (Extensible Markup Language), dokumenti dobijaju ekstenziju

docx, s tim što docx dokumenti nisu kompatibilni sa starijim verzijama Word-a. Sve nove

verzije mogu da procesiraju i doc dokumente, ali je podrazumevana ekstenzija sada docx.

Razlog promene tehnologije, prelazak sa binarnog sistema na XML, po mnogima je

pokušaj pribliţavanja ODF (Open Document Format) formatu koji je besplatan, i veoma

popularan van Sjedinjenih Američkih Drţava. Novi Microsoft Office format omogućava

čitanje sadrţaja dokumenata pomoću veb aplikacija, i što je još vaţnije olakšava otvaranje

Word dokumenata drugim sistemima za procesiranje teksta.

4.1 Uvod u XML (Extensible Markup Language)

XML je jezik tagova. Veoma slično HTML-u, XML se sastoji od parnih tagova,

koji opisuju podatke koji se između tagova nalaze. Microsoft Office je zasnovan na Office

Open XML formatu, koji se sastoji od uparenih tagova pomoću kojih se organizuje i

definiše sve ono što treba znati o jednom dokumentu. Sledi primer korišćenja XML-a u

jednom Word dokumentu, praćen objašnjenjem na koji način se čita takav kod.

Tag w: kojim započinje svaka linija označava informaciju o tipu dokumenta koji

opisuje, a to je Office Word 2007. Treba primetiti da se svaki tag nalazi unutar

uglastih zagrada.

Kao kod HTML-a, tagovi su upareni, gde drugi tag počinje kosom crtom.

Prva linija koda, odnosno <w:r> (text run) označava početak bloka teksta. Da bi se

kompletirala hijerarhija, čitav blok sa tekstom, mora da se nalazi između tagova na

Kreiranje docx i odt dokumenata u programskom jeziku PHP

14

višem nivou <w:p> (paragraf), koji u ovom primeru nije prikazan. Dalje, taj

paragraf bi morao da se nalazi unutar tagova <w:body>, koji sadrţi sve paragrafe,

ali i ostali sadrţaj, i tako dalje.

Druga i četvrta linija koda predstavljaju uparene tagove koji označavaju

formatiranje teksta. Treća linija koda predstavlja informaciju da je tekst podebljan,

<w:b />. Informacije o formatiranju teksta u Office Open XML-u, čuvaju se u

takvoj strukturi gde se tačno zna na koji deo teksta se to formatiranje odnosi (blok

teksta unutar kojeg se formatiranje nalazi), pa zato ovde nema uparenih tagova.

Kosa crta unutar prvog taga znači da ne postoji tag za zatvaranje. Ukoliko je tekst i

podebljan i iskošen, novi tag, <w:i /> se nalazi odmah ispod taga za podebljanje,

takođe unutar para tagova za formatiranje teksta.

Konkretan tekst unutar paragrafa, nalazi se u petoj liniji koda, unutar tagova

<w:t>.

Poslednja linija koda označava jednostavno zatvaranje početnog taga koji obuhvata

predstavljanje formatiranog teksta.

4.2 Office Open XML format

Office Open XML format u stvari predstavlja kompresovane foldere, čiji je sadrţaj

skup usko povezanih fajlova. Za kompresovanje se koristi ZIP tehnologija, a skup fajlova

koji predstavljaju Office Open format naziva se ZIP paket. Svaki fajl unutar paketa

predstavlja jedan deo dokumenta. U XML-u se često pominje reč schema, i ona predstavlja

skup pravila i standarda, koji definišu datu XML strukturu. Programeri mogu da kreiraju i

svoje XML šeme, kao deo dokumenta koji kreiraju, međutim, za takav poduhvat potrebno

je jako dobro poznavanje XML-a. Kako je Office Open format u stvari ZIP paket, fajlovima

se moţe pristupiti promenom ekstenzije dokumenta iz docx u zip. Otvaranjem ZIP paketa

dolazi se do sledeće strukture fajlova:

Slika 4.2.1 – Struktura docx dokumenata

Kreiranje docx i odt dokumenata u programskom jeziku PHP

15

Struktura se vidi na slici je veoma slična strukturi Excel 2007, ili PowerPoint 2007

dokumenata, samo što folder word ima naziv xls i ppt, respektivno.

Folder docProps sadrţi fajlove koji opisuju attribute aplikacije i samog dokumenta,

počev od imena autora, do broja reči u dokumentu i verzije softvera.

Folder _rels sadrţi fajl .rels koji opisuje vezu između foldera unutar paketa.

Moguće je dodati vezu sa fajlom koji nije na najvišem nivou unutar paketa, već se

nalazi unutar nekog od foldera, i naziv tog fajla treba da se nalazi unutar foldera

_rels. Fajlovi koji sadrţe informacije o uzajamnom odnosu su moţda i najvaţniji

unutar paketa, jer bez njih različiti delovi dokumenta ne znaju kako da komuniciraju

jedni sa drugima.

Još jedan folder na najvišem nivou paketa je [Content_Types].xml. On sadrţi

informacije o tipovima podataka sadrţanih u dokumentu. Na primer, u Word-u 2007

ova lista obično sadrţi fontove, stilove, teme, globalne opcije dokumenta i atribute

aplikacije. Fajlovi sa dodatnim elementima kao što su dijagrami, ili grafika, biće

identifikovani unutar ove liste.

Otvaranjem foldera word, dobija se sledeća hijerarhija fajlova:

Slika 4.2.2 - Struktura foldera word

Novi Word dokument sadrţi XML fajlove za fontove, stilove, stepen zumiranja, i

veb podešavanja. Ovi fajlovi postoje bez obzira na to da li se koriste unutar

dokumenta. Za grafiku, zaglavlja, futere, fusnote, komentare, kreiraju se posebni

XML fajlovi, samo ako se oni koriste unutar sadrţaja dokumenta.

Kao što se vidi, postoji folder theme koji sadrţi fajl sa informacijama o svim

temama koje se koriste unutar dokumenta. Ovaj fajl obezbeđuje čuvanje teme koja

se prilagođava za konkretan dokument, kao i njeno deljenje zajedno sa deljenjem

celog dokumenta.

Kreiranje docx i odt dokumenata u programskom jeziku PHP

16

Folder _rels sadrţi fajlove za mapiranje na nivou foldera word. Fajl koji se uvek

nalazi unutar ovog foldera, ima naziv document.xml.rels. Ako word dokument, na

primer sadrţi zaglavlje, onda se unutar foldera word nalazi fajl header.xml, a

unutar foldera _rels, header.xml.rels. Folder docProps, sa najvišeg nivoa paketa,

sadrţi sledeće fajlove:

Slika 4.2.3 – Struktura foldera docProps

Fajl app.xml sadrţi informacije o apliikaciji kao što je broj reči, ili verzija softvera,

dok core.xml sadrţi informacije o samom dokumentu, kao što je tema dokumenta , ili ime

autora. Dalje, ako postoji slika koja predstavlja dokument, ona se takođe nalazi unutar

foldera docProps.

4.3 Ključni delovi dokumenta

Jedan od najvaţnijih fajlova unutar ZIP paketa jeste [Content_Types].xml. Njegov

sadrţaj izgleda ovako:

Kreiranje docx i odt dokumenata u programskom jeziku PHP

17

Prva linija koda je zajednička za sve XML fajlove, i ona definiše tip XML strukture

koja se u dokumentu koristi. Konkretan sadrţaj fajla počinje prvim iz para tagova

<Types>, unutar kojih se nalaze definicije svih tipova elemenata sadrţanih u

dokumentu. U nastavku taga <Types> nalazi se referenca xmlns posle koje sledi

link. Ta referenca odnosi se na zajedničko ime koje se dodaje nazivu elemenata

unutar određenog foldera, da bi se izbeglo preklapanje imena, koje nije dozvoljeno

u XML-u. To je jedan od XML standarda, dodavanje zajedničkih imena u vidu veb

adresa, ali te adrese uopšte ne moraju biti validne. Takve adrese samo identifikuju

lokaciju XML šeme koja se koristi unutar dokumenta, ili sadrţe definicije strukture

elemenata koji se u dokumentu koriste.

Sledeće tri linije koda unutar tagova <Types>, definišu tri ekstenzije fajlova koje

se nalaze unutar paketa. To su: rels (fajl za mapiranje), wmf (Windows Metafile

Picture) koji se koristi za naslovnu sliku dokumenta, i XML.

Ostatak koda sadrţi tagove <Override> sa atributima PartName i ContentType,

koji definišu tip sadrţaja delova dokumenta unutar foldera word i docProps.

Sledi prikaz sadrţaja fajla .rels koji se nalazi na najvišem nivou ZIP paketa:

Kreiranje docx i odt dokumenata u programskom jeziku PHP

18

Treba primetiti da iako fajl .rels i [Content_Types].xml nemaju sličan sadrţaj,

struktura koda je veoma slična. Prva linija koda definiše XML standard koji se koristi,

druga linija otvara par tagova između kojih se nalazi funkcionalni deo ovog fajla. I u ovom

fajlu se koristi dodavanje zajedničkog imena elementima, adresa je vrednost atributa

xmlns. Svaki od tagova <Relationship> ima tri atributa: Id, Type i Target.

Id predstavlja identifikacioni string, koji se uglavnom kreira tako što se stringu

“rId“ doda broj. Ovakva struktura nije obavezna, pa se u različitim delovima

dokumenta mogu videti različiti tipovi identifikacije.

Type je tip koji je definisan unutar primenjene šeme, i isto kao kod zajedničkih

imena, iako je to prividno veb adresa, dokument ne čita nikakve podatke sa te

adrese, niti njoj pristupa.

Target je fizička adresa fajla unutar paketa, koji se tagom <Relationship>

referencira. Referenciranje moţe da se odnosi i na neku eksternu adresu, van ZIP

paketa, i tada atribut Target ima sledeću vrednost:

Kreiranje docx i odt dokumenata u programskom jeziku PHP

19

Glava 5

Struktura dokumenata sa ekstenzijom odt

Većina aplikacija za procesiranje teksta koristi binarni format za čuvanje podataka.

Microsoft Word tek od verzije 2007 prelazi na Office Open XML format. Osnovni

nedostatak takvog načina čuvanja podataka je nepoznavanje interne strukture podataka.

Ako postoji potreba da se podacima pristupa iz neke eksterne aplikacije, ili servisa, to

jedino moţe da se učini konvertovanjem u RTF (Rich Text Format), ili CSV (Comma

Separated Values) format. Tu postoji još jedan problem, a to je podrška za takve tipove

konverzija, ukoliko softver koji se koristi nema tu vrstu podrške, gotovo da ne postoji način

da se podaci iz dokumenta preuzmu iz neke eksterne aplikacije. Sa druge strane, softver

moţe da sadrţi podršku za konvertovanje podataka, ali se prilikom konverzije moţe

izgubiti formatiranje podataka, što je još jedan ozbiljan nedostatak. Ako kompanija koja je

proizvela taj softver pređe na drugi interni format, dokument postaje beskoristan, jer nova

verzija ne moţe da ga pročita. Zbog ovakvih problema organizacija OASIS (Organization

for Advancement of Structured Information Standards) kreira ODF (Open Document

Format) format koji je baziran na XML-u.

5.1 Open Document format

Da bi se smanjila veličina dokumenta, Open Document koristi kompresovani JAR

(Java Archive) format. JAR je kompresovani ZIP paket koji sadrţi dodatnu komponentu,

fajl manifest koji predstavlja sadrţaj paketa. Kako je svaki JAR fajl takođe i ZIP paket,

moţe se koristiti bilo koji alat za raspakivanje dokumenta, i direktno čitanje XML fajlova.

Svi tekstualni dokumenti imaju ekstenziju odt (Open Document Text). Svaki odt dokument

ima sledeću strukturu:

Kreiranje docx i odt dokumenata u programskom jeziku PHP

20

Slika 5.1.1 – Struktura odt dokumenta

Configuration2 folder sadrţi fajlove koji sadrţe informacije o makroima

(automatizacija uobičajenih akcija sa palete alatki)

Folder META-INF sadrţi samo fajl manifest.xml koji nam daje listu svih fajlova u

JAR paketu. Ovaj fajl nije isti kao manifest.xml koji se koristi u Javi, ali mora biti u

JAR formatu da bi dokument mogao da ga pročita.

Naslovna slika dokumenta nalazi se unutar foldera Thumbnails.

Content.xml predstavlja konkretan sadrţaj dokumenta, tu se nalaze svi elementi, i

neki od stilova elemenata.

Informacije o autoru, datum poslednje revizije i ostali podaci o dokumentu, nalaze

se unutar fajla meta.xml.

Mimetype fajl sadrţi samo jedan red, koji govori o MIME (Multi-purpose Internet

Mail Extensions) tipu dokumenta. MIME tipovi formiraju standardan način

klasifikacije tipova fajlova na internetu.

Settings.xml sadrţi informacije o aplikaciji. Neke od ovih informacija, kao što su

veličina i pozicija prozora, podaci za štampanje, zajedničke su za većinu

Kreiranje docx i odt dokumenata u programskom jeziku PHP

21

dokumenata. Tekstualni dokumenti uglavnom sadrţe i informacije o stepenu

zumiranja, o tome da li su zaglavlja na početku i na kraju strane vidljiva, i druge.

Styles.xml sadrţi stilove koji se koriste u dokumentu. Odvojenost sadrţaja

dokumenta od stilova doprinosi fleksibilnosti ODF formata.

Kao što vidimo, postoji i fajl manifest.rdf, gde RDF (Resource Description

Framework) format omogućava takvu prezentaciju podataka koja odgovara i

korisniku i kompjuteru, odnosno podaci cu čitljivi i običnom korisniku.

5.2 Ključni delovi ODT dokumenta

Fajl content.xml je, bez pogovora, najbitniji deo JAR paketa, ali je takođe usko

povezan sa fajlovima meta.xml, settings.xml i style.xml. Jedini fajlovi koji su neophodni

za osnovnu funkcionalnost dokumenta su content.xml i manifest.xml. Ukoliko se kreira

dokument koji sadrţi samo ove fajlove, program koji procesira odt format, moţe da otvori i

pročita takav dokument, s tim što je sadrţaj običan tekst bez stilova. Ne postoje nikakve

meta informacije o autoru dokumenta, o vremenu poslednje revizije, a podešavanja kao što

su stepen zumiranja, ili veličina prozora dobiće fabričke vrednosti aplikacije.

5.2.1 Settings.xml

Fajl settings.xml sadrţi informacije kojim pristupa jedino tekstualni procesor koji

čita dokument, tako da nije od velike koristi eksternoj aplikaciji koja kreira, ili pristupa

dokumentu. Koren svih tagova u ovom fajlu jeste <office:document-settings>.

Unutar njega nalazi se par tagova <office:settings>, koji sadrţi jedan, ili više

elemenata <config:config-item-set>. Osnovni elementi konfiguracije su

imenovani elementi mape i indeksirani elementi mape.

Tag <config:config-item> označava konkretan element konfiguracije i

moţe imati kao atribute: config:name, koji opisuje konkretan element i config:type, koji

definiše jedan od tipova elemenata konfiguracije : boolean, short, int, long, double, string,

datetime i Base64Binary.

Sledi primer strukture elemenata konfiguracije:

Kreiranje docx i odt dokumenata u programskom jeziku PHP

22

Imenovani elementi mape označavaju se tagovima

<config:config-item-map-named>, unutar kojih se nalazi jedan, ili više

elemenata sa tagovima <config:config-item-map-entry>. Na ovom nivou

strukture mogu da se nađu i novi imenovani elementi mape, indeksirani elementi mape, pa

vidimo da ovakva struktura podrţava rekurziju. Imenovanim elementima mape se pristupa

isključivo preko imena (atribut name) koje mora biti jedinstveno.

Indeksirani elementi mape, veoma su slični imenovanim elementima mape, i

predstavljaju se tagovima <config:config-item-map-indexed>. Struktura je ista

kao i kod imenovanih elemenata, osim što je ovde redosled elemenata bitan, jer se njima

pristupa preko pozicije (atribut index), a ne preko imena.

5.2.2 Meta.xml

Fajl meta.xml sadrţi podatke o samom dokumentu. Sve meta-informacije mogu se

svrstati u četiri kategorije: opšti atributi dokumenta, opis dokumenta, korisnička

podešavanja i statistički podaci. Sledeća lista pokazuje atribute dokumenta po

kategorijama:

Opšti atrubuti dokumenta

o Datum i vreme kreiranja dokumenta, kao i ime autora

o Datum i vreme poslednje promene dokumenta

o Digitalni potpis

o Datum i vreme poslednjeg štampanja

o Ukupno vreme procesiranja dokumenta

o Broj revizije

Opis dokumenta

Kreiranje docx i odt dokumenata u programskom jeziku PHP

23

o Naziv

o Tema

o Ključne reči

o Komentari

Korisnička podešavanja

o Maksimalna duţina teksta

o Ime mentora

o Broj poglavlja

o Podnaslov poglavlja

Statistički podaci

o Broj strana

o Broj tabela

o Broj grafičkih elemenata

o Broj paragrafa

o Broj reči

o Broj karaktera

o Broj linija teksta

5.2.3 Styles.xml

Styles.xml sadrţi informacije o stilovima koji su korišćeni u dokumentu. Neke od

informacija su duplirane i unutar fajla content.xml. Fajl styles.xml počinje tagom

<office:document-styles>, a unutar kojeg se nalaze deklaracije fontova

(<office:font-decls>), fabrički i imenovani stilovi (<office:styles>),

neimenovani, ili automatski stilovi (<office:automatic-styles>), i master stilovi

(<office:master-styles>). Nijedan od navedenih elemenata nije neophodan da bi

dokument pravilno funkcionisao. Deklaracije fontova se sastoje od elemenata

<style:font-face>, koji mogu imati sledeće atribute:

Kreiranje docx i odt dokumenata u programskom jeziku PHP

24

style-name - ime stila, ovaj atribut je obavezan

svg:font-family - familija fontova, nije uvek ista kao ime fonta, na primer font sa

imenom Courier Bold Oblique pripada familiji Courier, i tu vrednost bi ovaj atribut

trebao da sadrţi.

style:font-family-generic - generička klasa kojoj ovaj font pripada. Validne

vrednosti ovog atributa su: roman (serif), swiss (sans-serif), modern, decorative,

script i system.

style:font-pitch - govori o tome da li je font fiksirane, ili promenljive širine.

style:font-charset - kodiranje karaktera, i ovaj atribut nije obavezan.

Najvaţniji elementi koji se nalaze unutar tagova <office:styles> su

<style:default-style> i <style:style>. Oba elementa sadrţe obavezan

atribut style:family, koji određuje nivo na koji se stil primenjuje. Moguće vrednosti ovog

atributa su : text, paragraph, section, table, table-column, table-row, table-cell, table-page,

chart, graphics, default, drawing-page, presentation i control. Još jedan zajednički atribut

za oba elementa je style:name. Automatski stilovi dobijaju imena tako što se skraćenici

imena (jedno, ili dva slova) doda broj, T1 je prvi automatski stil za element za

style:family = “text”, P3 treći automatski stil za paragrafe, ta2 drugi automatski stil za

tabele, ro4 četvrti stil za red tabele i tako dalje.

Atribut parent-style-name javlja se onda kada postoje nasleđeni stilovi. ODF

procesor kreira privremen stil čiji se roditelj nalazi u fajlu styles.xml.

Unutar fabričkih i korisničkih stilova, nalazi se element

<style:family-properties>, gde se “family” menja vrednošću atributa style-

family. Na primer ako stil ima vrednost atributa style-family = “table“, onda će sadrţati i

element <style:table-properties>. Sledi primer definicije stila u odt dokumentu:

5.2.4 Content.xml

Iako se sadrţaj fajla content.xml razlikuje od dokumenta do dokumenta, postoje

elementi koji su standardni za sve tipove dokumenata. U korenu fajla nalazi se tag

<office:document-content> čiji atribut office:version određuje koja verzija Open

Kreiranje docx i odt dokumenata u programskom jeziku PHP

25

Document-a se koristi. Element <office-scripts> nalazi se u većini dokumenata, i

uglavnom je prazan, čak iako dokument sadrţi makroe. Posle njega dolaze elementi koji

definišu prezentaciju dokumenta. Neobavezan element <office:font-face-decls>

opisuje fontove korišćene unutar dokumenta, duplirajući informacije iz styles.xml - a.

Ukoliko se koriste automatski stilovi u dokumentu, javlja se i element

<office:automatic-styles>. Poslednji element, koji je obavezan i ujedno

najvaţniji jeste <office:body>. Ovde se definiše svaka akcija u dokumentu. Prvi

element unutar njega pokazuje koji tip dokumenta se procesira. Za tekstualne dokumente to

je <office:text>.

Sledi primer strukture fajla content.xml :

Kreiranje docx i odt dokumenata u programskom jeziku PHP

26

Glava 6

Rad sa XML-om u PHP-u

Klasa PHPWord koristi ekstenziju PHP-a XMLWriter, za rad sa XML fajlovima.

Ova ekstenzija je deo xmlWriter API-ja, i ona čini rad sa XML fajlovima veoma

jednostavnim. Pomoću ove ekstenzije mogu se kreirati XML dokumenti sloţene strukture.

Trenutna struktura se čuva u memoriji, tako da u svakom trenutku moţe da se prikaţe

sadrţaj dokumenta. PHPWord koristi postojeću ekstenziju, međutim sadrţi i svoju klasu za

rad sa XML fajlovima, koja instancira objekat tipa XMLWriter, koristi sve njegove

funkcije, uz dodatak svojih funkcija, koje su korisne za konkretan rad sa tekstualnim

dokumentima. Sledi opis najvaţnijih funkcija ekstenzije XMLWriter, koje se koriste u

kreiranju docx i odt dokumenata, u redosledu u kojem se koriste:

openMemory ( void ): bool - kreira novi XMLWriter koristeći memoriju za

čuvanje sadrţaja.

startDocument( string $ver, string $enc, string $aln ): bool - otvara

tag za početak dokumenta, gde prvi parametar označava verziju dokumenta, kao deo

XML deklaracije, drugi parametar predstavlja kodiranje dokumenta, i treći

parametar govori da li dokument ima eksterne reference, ili je potpuno nezavistan.

startElement ( string $name ): bool - Otvara tag za početak elementa, sa

imenom zadatim preko parametra $name.

writeAttribute ( string $name , string $value ): bool - kreira atribut

elementu unutar kojeg se nalazi, sa imenom $name i vrednošću $value.

writeRaw ( string $content ): bool - upisuje običan tekst unutar xml

dokumenta, sa sadrţajem zadatim preko parametra $content.

endElement ( void ): bool - zatvara tag elementa koji je poslednji otvoren u

dokumentu.

endDocument ( void ): bool - zatvara tag trenutnog dokumenta.

Kreiranje docx i odt dokumenata u programskom jeziku PHP

27

Klasa PHPWord, sadrţi i sledeće dodatne funkcije:

writeElementBlock ( $elem , $att, $val ): bool - kreira element sa

nizom atributa. To moţe biti jedan par atribut-vrednost, ili asocijativni niz atributa i

vrednosti.

writeElementIf ( $con , $elem, $att, $val ): bool - upisuje element sa

datim atributom, samo ako je ispunjen uslov dat preko parametra $con (condition).

writeAttributeIf ( $con, $att, $val ): bool - upisuje atribut unutar

elementa koji je poslednji započet, ako je ispunjen uslov koji je zadat preko

parametra $con.

Pored ovih, postoji još dosta funkcija ove ekstenzije PHP-a, ali se ređe koriste. Omogućen

je rad sa CDATA (Character Data) elementima, odnosno moguće je kreirati deo

dokumenta, sa elementima koji se odnose samo na karaktere i njihove atribute. Takođe,

moguće je kreirati DTD (Document Type Definition) elemente, koji određuju strukturu

dokumenta. Postoje funkcije za kreiranje DTD liste, gde se navodi niz validnih tagova, koji

su dozvoljeni za strukturu trenutnog dokumenta.

Kreiranje docx i odt dokumenata u programskom jeziku PHP

28

Glava 7

Postojeća biblioteka PHPWord i napravljene izmene

Biblioteka PHPWord je uglavnom bazirana na podršci za docx dokumente, i pruţa

dosta mogućnosti u kreiranju veoma sloţenih dokumenata. Što se tiče odt fajlova, nije

moguće napraviti dokument koji sadrţi makar osnovne elemente kao što su određene vrste

fontova, paginacija paragrafa, tabele, i tako dalje. Cilj ovog rada je osposobiti biblioteku

PHPWord za kreiranje jednog potpunog odt dokumenta, sa svim osnovim elementima i

globalnim podešavanjima dokumenta, a da se to uradi pomoću poziva istih funkcija kao i

za docx dokument.

7.1 Opis postojeće klase PHPWord

Ova biblioteka je besplatna, moţe se naći na sledećem linku PHPOffice/PHPWord.

Ideja je da se koriste funkcije sa istim imenima i za docx, i za odt fajlove. Odgovarajuća

funkcija se poziva u odnosu na odabir tipa ekstenzije dokumenta (funkcija

createWriter($fileType) ) . Generalno je to dobra ideja, ali je mnogo lakše

implementirati za rad sa XML fajlovima unutar docx formata, pa je zato podrška za taj tip

dokumenta neuporedivo bolja. Za izmenu biblioteke korišćeno je Zend okruţenje. Pomoću

ovog okruţenja lakše je uočiti strukturu i princip funkcionisanja biblioteke.

Glavni problem je rad sa ugnjeţdenim tagovima kod odt formata. Ukoliko se

kreiraju nabrajanja, za docx dokumente dovoljno je navesti broj nivoa na kojem se nalazi

tekst, i docx procesor tekst prikazuje tačno na tom nivou. Kod odt formata, ako tekst treba

da bude na nivou broj dva, onda se kreiraju dve ugnjeţdene liste, a unutrašnja lista sadrţi

element sa ţeljenim tekstom. Kako program teče sekvencijalno, red po red, ne zna se da li

će sledeći element liste biti poslednji, pa ne postoji informacija da li treba zatvoriti otvoreni

tag. Takođe, teško je odrediti koliko tagova treba zatvoriti, jer mora postojati informacija da

li je sadrţaj na istom nivou kao prethodni tekst (ukoliko je na višem nivou, treba najpre

zatvoriti tagove niţeg nivoa). U prethodnim poglavljima prikazano je da se tekstualni

dokumenti sastoje od nekoliko XML fajlova različite vaţnosti. PHPWord prati hijerarhiju

kreiranja fajlova gde se najpre kreiraju stilovi koji se koriste unutar sadrţaja dokumenta, pa

tek onda sadrţaj. Kao što je ranije pomenuto, kod odt formata postoji i dupliranje podataka

u styles.xml, i content.xml fajlu. Postoje određeni elementi čiji se stil navodi direktno u

sadrţaju, kao što je stil reda, ili kolone tabele, i još nekoliko drugih elemenata (interna

pravila kod odt formata). To je još jedan problem koji se javlja u implementiranju iste

strukture za docx i odt dokumente.

Kreiranje docx i odt dokumenata u programskom jeziku PHP

29

Ako je cilj napraviti jedan kompletan dokument, sa svim osnovnim elementima

(postoje mogućnosti dodavanja skoro svih sloţenih elemenata, ali to ne ulazi u sklop ovog

rada), ovo su mogućnosti koje pruţa PHPWord u radu sa docx dokumentima:

Podešavanje margina stranice

Dodavanje globalnog stila paragrafa

Dodavanje globalne veličine i naziva fonta

Dodavanje imenovanog stila fonta, sa svim dostupnim opcijama kao što su boja

fonta, veličina, razmak između slova, i tako dalje.

Dodavanje imenovanog stila paragrafa, sa dostupnim opcijama kao što su uvučenost

s leva, desna, poravnanje, prostor pre i posle paragrafa, i ostalim opcijama.

Dodavanje teksta sa stilom paragrafa u vidu naziva, i u vidu niza opcija paginacije

paragrafa.

Dodavanje teksta sa stilom fonta u vidu naziva, i u vidu niza opcija fonta.

Dodavanje niza rečenica u okviru istog paragrafa, ali sa različitim stilom fonta

svake od njih (TextRun).

Prelaz u novi red (TextBreak)

Prelazak na novu stranicu (pageBreak).

Dodavanje nabrajanja

Dodavanje liste na više nivoa

o Dodavanje zasebnih nivoa sa svojim opcijama (razmak teksta od početka

nivoa, uvučenost, poravnanje)

o Dodavanje teksta na svakom od nivoa, gde tekst moţe imati svoj stil fonta i

paragrafa

o Dodavanje različitih prefiksa i sufiksa

Dodavanje niza rečenica u okviru istog elementa liste sa različitim stilovima fonta

Dodavanje slike sa zadatom širinom, visinom, i poravnanjem

Dodavanje tabela

Kreiranje docx i odt dokumenata u programskom jeziku PHP

30

o Dodavanje stila tabele sa stilom prvog reda (boja pozadine, debljina i boja

ivice, razmak između teksta i ivice ćelije)

o Dodavanje reda tabele sa zadatom visinom

o Dodavanje ćelije sa zadatom širinom, i zadatim stilom (vertikalno

poravnanje teksta, pravac teksta, boja pozadine)

o Spajanje ćelija horizontalno i vertikalno

Dodavanje header-a i footer-a

Što se tiče odt formata, kao što je rečeno, podrška je mnogo slabija, i postoje sledeće

mogućnosti:

Dodavanje globalnog naziva i veličine fonta.

Dodavanje imenovanog stila fonta, sa svim dostupnim opcijama fonta osim

razmaka između slova.

Dodavanje imenovanog stila paragrafa, ali samo sa opcijama za prostor pre i posle

paragrafa.

Dodavanje teksta sa zadatim stilom fonta, preko imena stila, ili niza opcija, bez

paginacije paragrafa.

Dodavanje niza rečenica u okviru istog paragrafa, sa različitim stilovima fonta, bez

paginacije paragrafa.

Prelazak u novi red

Kao što se vidi iz priloţenog, ovo je nedovoljan broj opcija, čak i za kreiranje

dokumenta koji sadrţi samo običan tekst, jer nije moguće formatiranje paragrafa. To je

glavni razlog postojanja ovog rada, pribliţiti funkcionalnost u oba formata, do nivoa gde se

mogu bez problema kreirati dokumenti sa elementima koji se najčešće koriste. Postoji i

neusaglašenost jedinica mere između docx procesora i odt procesora. Unutar XML fajlova

najčešće se koristi univerzalna jedinica TWIP, međutim Word to konvertuje u Point, a

OpenDocument procesori u Inch. Tekstualni procesori prihvataju preciznost do dve

decimale, pa se javlja razlika u vidu zanemarenog ostatka, koja je vidljiva već posle

dodavanja nekoliko elemenata. Pri dodavanju prostora pre i posle paragrafa, ili visine

Kreiranje docx i odt dokumenata u programskom jeziku PHP

31

elemenata, treba odabrati takvu vrednost koja pri konverziji daje najviše dve decimale,

inače će ostatak biti zaokruţen, i javiće se razlika.

7.2 Izmene postojeće klase PHPWord

Izmena podrazumeva dodavanje novih klasa, implementiranje funkcionalnosti

postojećih klasa, čak i izmenu nekih funkcija, gde je jednostavno moralo doći do izvesnih

razlika u broju parametara, ali logika ostaje ista. Dodati parametri određenim funkcijama za

rad sa odt dokumentima ne narušavaju logiku koju diktira docx format. Sledi prikaz svih

poboljšanja klase, zajedno sa objašnjenjem, tamo gde implementacija nije trivijalna:

Podešavanja margina stranice - Polazna PHPWord klasa ima fiksirane margine,

koje se upisuju u styles.xml. Unutar klase /Style/Section kreirane četiri statičke

promenljive za svaku od margina. Vrednosti se postavljaju unutar klase

/Writer/ODText/Part/Styles, u okviru funkcije writePageLayout(). Sledi

primer upisa gornje margine u styles.xml fajl, ostale se analogno dodaju:

$xmlWriter->writeAttribute('fo:margin-top',Section::$mar

gin_top_odt);

Podešavanje margina (primer za gornju marginu) vrši se sledećom naredbom:

$section->getSettings()->setMarginTop($value);

Dodate sledeće opcije paragrafa:

o Uvučenost paragrafa (right, left, hanging) - Polazna biblioteka ne sadrţi

funkcije za uvlačenje paragrafa. Ciljna klasa je

/Writer/ODText/Style/Paragraph. Tri osnovna atributa za uvučenost

paragrafa su: fo:margin-left, fo:margin-right i

fo:text-indent. Poslednji atribut se koristi za uvučenost prvog reda.

Kada se postavlja “hanging” uvučenost, treba imati na umu da se tu menjaju

vrednosti i za levu marginu, i za uvučenost teksta. Sledi primer

implementacije uvučenosti paragrafa sa leve strane:

$xmlWriter->writeAttribute(‘fo:margin-left’,

$style->getIndentation()->getLeft);

Promenljiva $style je instanca klase /Style/Paragraph gde se čuva stil

paragrafa. Ovako izgleda podešavanje uvučenosti prvog reda paragrafa:

Kreiranje docx i odt dokumenata u programskom jeziku PHP

32

$PHPWord->addParagraphStyle('pStyle',

array('indentation' => array('firstLine' => 240)));

Poravnanje (right, left, center, justify) - Polazna klasa nudi rešenje

prekopirano iz ogranka za docx format. Sledi primer zadavanja poravnanja

paragrafa:

$PHPWord->addParagraphStyle('pStyle',array('align'=

>'center'));

Implementacija upisa poravnanja u styles.xml fajl je trivijalna:

$xmlWriter->writeAttribute('fo:text-align', $style-

>getAlign());

Ovo ne radi za poravnanje tipa “both”. Parametar pri dodavanju stila jeste

“both”, ali atribut fo:text-align traţi vrednost “justify” za tu vrstu

poravnanja. Dakle, uneto je ispitivanje za ovu vrstu poravnanja, i dodata

odgovarajuća vrednost atributa.

o Razmak izmeĎu linija - Podrazumevana jedinica mere u PHPWord-u je

TWIP. Razmak između linija od 240 TWIP-a odgovara jednom redu. Za

docx dokumente se vrši konverzija u broj redova, dok za odt format nije

implementirana ova opcija u polaznoj klasi. Razlika je što odt procesor

prihvata samo vrednost u procentima, gde 100% predstavlja rastojanje od

jednog reda (240 Twip-a). Sledi primer podešavanja razmaka na jedan red:

$PHPWord->setDefaultParagraphStyle(array('spacing'=

>240));

Implementirana je konverzija u procente, i upisivanje u styles.xml fajl:

$spacing = (($style->getSpacing()/240)*100).'%';

$xmlWriter->writeAttributeIf(!is_null($style->getSp

acing()), 'fo:line-height', $spacing);

o Widow/Orphan control opcija - Podrazumeva se da je ova opcija

uključena, ukoliko se eksplicitno ne isključi. U polaznoj klasi ne postoji

implementacija. Isključivanje ove opcije se vrši na sledeči način:

Kreiranje docx i odt dokumenata u programskom jeziku PHP

33

$PHPWord->addParagraphStyle('pStyle',

array('widowControl'=>false));

Dodata je samo provera vrednosti parametra “widowControl“, i upis u

styles.xml:

$xmlWriter->writeAttribute('fo:widows', 0);

o Keep Lines Together - Sprečava razdvajanje linija paragrafa. Ova opcija

paragrafa se jednostavno dodaje u asocijativni niz sa ostalim opcijama stila:

$PHPWord->addParagraphStyle('pStyle',

array('keepLines'=>true));

Implementacija se svodi na dodelu odgovarajuće vrednosti atributu

'fo:keep-together':

$xmlWriter->writeAttributeIf($style->isKeepLines(),

'fo:keep-together','always');

o Keep With Next - Sprečava razdvajanje uzastopnih paragrafa.

Implementacija i upotreba je analogna prethodnoj opciji (odgovarajući

atribut je 'fo:keep-with-next', a opcija stila 'keepNext').

Polazna biblioteka nije sadrţala implementaciju.

o Dodavanje globalnog stila paragrafa - Globalni stil svih paragrafa se

postavlja istom naredbom kao i za podešavanje razmaka između redova. U

polaznoj biblioteci, dodati stil se čuva u okviru asocijativnog niza. Pri

kreiranju fajla styles.xml, prolaskom kroz niz, nigde se ne ispituje da li je

trenutni stil baš taj podrazumevani za sve paragrafe, pa se samim tim i ne

upisuje kao globalni stil u xml fajl. Dodata je provera za podrazumevani stil

(ime stila ima vrednost “Normal“) u klasi /Writer/ODText/Part/Styles, u

okviru funkcije writeDefault(XMLWriter $xmlWriter). Ako je

stil instanca klase /Style/Paragraph, i ako je to globalni stil za sve paragrafe,

poziva se funkcija za upisivanje, write() iz klase

/Writer/ODText/Style/Paragraph.

Dodavanje teksta sa zadatim stilom paragrafa - Stil paragrafa se dodaje

naredbom addParagraphStyle($name, $options). Konkretan paragraf

se dodaje naredbom:

Kreiranje docx i odt dokumenata u programskom jeziku PHP

34

$section->addText($text, $fontStyle, $parStyle);

Parametar $parStyle moţe biti ime paragrafa, dakle string, a moţe biti i

asocijativni niz sa opcijama stila. U tom slučaju ime stila dobija sledeću vrednost:

“P$”, gde znak $ predstavlja redni broj paragrafa u dokumentu. Polazna biblioteka

sadrţi pogrešnu implementaciju za dodavanje stila paragrafa čije ime sadrţi redni

broj paragrafa. Pogrešan parametar se prosleđuje funkciji

addParagraphStyle(). Dodavanje teksta sa imenom stila paragrafa kao

parametrom nije omogućeno u polaznoj verziji. Unutar klase

/Writer/ODText/Part/Content, u okviru funkcije getElementStyle(), dodata

je nova grana u ispitivanju tipa stila paragrafa. U slučaju da je to string, paragrafu se

se postavlja ime stila na vrednost zadatog stringa, sledećom naredbom:

$element->setParagraphStyle($paragraphStyle);

PageBreak - Za razliku od docx formata, gde se moţe ubaciti praznu stranicu na

bilo kom mestu u XML fajlu, kod odt formata je pageBreak referencnog tipa, dakle

mora da se odnosi na konkretan element, pre koga se prazna stranica ubacuje. Pri

kreiranju stila konkretnog elementa, dodaje se opcija za ubacivanje prazne stranice.

Najlakši način za upotrebu ove opcije jeste kreiranje jednog stila paragrafa na

početku dokumenta, za dodavanje pageBreak-a, sledećom naredbom:

$PHPWord->addParagraphStyle('pageBreak',

array('pageBreakBefore'=>true));

Većina elemenata u svom konstruktoru ima stil paragrafa kao parametar, pa je

ovakav način najprikladniji. Ovo nije bilo moguće u polaznoj verziji. Tabela, sa

druge strane, nema stil paragrafa, pa je klasi /Style/Table dodato polje

$pageBreak, sa geterima i seterima. Unutar klase /Writer/ODText/Style/Table

dodata je provera da li postoji pageBreak pre trenutne tabele. Ukoliko postoji, vrši

se upisivanje odgovarajućeg atributa u styles.xml fajl sledećom linijom koda:

$xmlWriter->writeAttribute('fo:break-before','page');

Dodavanje lista na više nivoa - Klasa za rad sa listama nije bila uključena u deo

za odt format, pa je dodata čitava klasa sa implementacijom koja prati logiku rada

sa docx formatom. Dodata je promenljiva $lastLevel u klasi

/Element/ListItem, koja čuva poslednji dodati element liste, odnosno njegov nivo,

Kreiranje docx i odt dokumenata u programskom jeziku PHP

35

kako bi pri kreiranju novog elementa, svi prethodno otvoreni tagovi bili zatvoreni.

Takođe, dodato je polje $isLastItem, koje označava da li je element poslednji u

listi. Takvo polje nam omogućava zatvaranje početnog taga 'text:list'.

Polazna verzija ne sadrţi klasu /Writer/ODText/ListItem, samim tim ni mogućnost

kreiranja liste. Dodata je navedena klasa, i implementirana funkcija write().

Lista sa jednim elementom mora da sadrţi tag za početak i kraj liste

'text:list', između kojih se nalazi konkretan element 'text:list-item',

koji sadrţi ţeljeni tekst. Funkcija write()se poziva za svaki element liste. Ako je

on na dubljem nivou, unutar trenutnog 'text:list-item' elementa otvara se

nova lista, sa novim 'text:list-item' elementom, i tako dalje. Zato ovde

imamo nekoliko slučajeva:

o Trenutni element moţe biti početak liste, pa u tom slučaju treba otvoriti

početni tag.

o Trenutni element moţe biti na niţem nivou, pa se unutar trenutnog elementa

započinje nova lista, sa elementima na niţem nivou.

o Trenutni element moţe biti na višem nivou, u tom slučaju treba zatvoriti

prethodno otvorene tagove. Broj zatvorenih tagova zavisi od razlike u nivou.

o Trenutni element je ujedno i kraj liste, treba zatvoriti početak liste (ujedno

zatvoriti i prethodno otvorene tagove, u zavisnosti od nivoa).

Sledi primer kreiranja liste (ostali elementi liste se kreiraju analogno početnom), sa

mogučnošću promene stila teksta za svaki od nivoa:

$section->addListItem($txt,$lvl,$fontStyle,$listStyle,

$parStyle,$isLast);

Dodavanje predefinisanog stila liste - Iz prethodne naredbe za kreiranje liste vidi

se parametar za stil liste. U polaznoj verziji ne postoji klasa

Writer/ODText/Style/Numbering, samim tim ni implementacija ove opcije. Dodata

je ova klasa, sa implementiranom funkcijom write(). Svaki nivo liste moţe imati

drugačiju oznaku nabrajanja, bilo da je to arapska, ili rimska cifra, veliko, ili malo

slovo... Ubačena je iterecija kroz nivoe liste, i kreiranje odgovarajućeg stila, u

okviru funkcije write(). Kreiranje predefinisanog stila liste sa 2 nivoa izgleda

ovako:

$lvl1 = array('format' => 'bullet','text' => '•',

'left' => 360, 'hanging' => 360, 'tabPos' => 360);

Kreiranje docx i odt dokumenata u programskom jeziku PHP

36

$lvl2 = array('format' => 'decimal','text' => '%2.',

'left' => 720, 'hanging' => 360, 'tabPos' => 360);

$PHPWord->addNumberingStyle('multilevel', array('type'

=> 'multilevel', 'levels' => array($lvl1, $lvl2)));

Unutar parametra ’text’ moţe se menjati izgled sufiksa, u ovom slučaju je to tačka.

Dodavanje slike sa zadatom širinom, visinom i poravnanjem - U polaznoj

biblioteci moguće je dodati neformatiranu sliku, ona će automatski imati poravnanje

uz levu ivicu. U klasi /Element/Image dodato polje $pStyle, za stil paragrafa kojim

je slika obuhvaćena. Klasi /Writer/ODText/Style/Image dodato vezivanje slike za

paragraf:

$xmlWriter->writeAttribute('text:anchor-type',

'paragraph');

Slika se u dokument ubacuje sledećom naredbom:

$section->addImage($path, $imageStyle, $paragraphStyle);

Ukoliko se dodaje pageBreak pre slike, ta opcija se navodi u okviru parametra

$paragraphStyle.

Dodavanje tabela - Polazna klasa PHPWord ispisuje tekst koji je zadat u okviru

ćelija, ali ne postoje granice tabele, niti bilo kakav stil tabele, ili teksta. U styles.xml

fajl se ne upisuje stil reda i kolone tabele, samim tim ne moţe da se zada visina reda

i širina kolone. Tekst unutar ćelije ne moţe biti stilizovan. Prvi red tabele ne moţe

imati zaseban stil. Implementacija rada sa tabelama obuhvata sledeće:

o Iscrtavanje ćelija tabele ivicu po ivicu - Nije dozvoljeno istu ivicu iscrtati

više puta. Dodata je klasa /Writer/ODText/Style/Cell. Upis stila ćelija mora

da se vrši u content.xml, a ne u styles.xml fajl, inače odt procesor ne

prepoznaje zadate stilove. Boja ivica tabele mora postojati, čak i kada se ne

zadaje eksplicitno unutar stila tabele. Dodata je podrazumevana boja ivice,

koja se menja samo ukoliko se eksplicitno zada. Svaka ćelija ima donju i

levu ivicu. Ćelije prvog reda imaju i gornju ivicu, a ćelije poslednje kolone i

desnu ivicu. Stilovi ćelije upisuju se unutar taga

'style:table-cell-properties'. Sledi primer iscrtavanja leve

ivice ćelije:

Kreiranje docx i odt dokumenata u programskom jeziku PHP

37

$xmlWriter->writeAttribute('fo:border-left',

$tableStyle->getBorderLeftSize().$borderColor);

Kao što se vidi iz priloţenog, atribut 'fo:border-left' traţi kao

vrednost i debljinu, i boju ivice, u vidu stringa. Zbog toga boja ivice mora

postojati, čak i ukoliko se eksplicitno ne zada u okviru stila.

o Podešavanje udaljenosti teksta od margina ćelije - Unutar klase

/Writer/ODText/Style/Cell dodata je implementacija razmaka teksta od

margina ćelije, koji se upisuje sledećom naredbom:

$xmlWriter->writeAttribute('fo:padding',

$tableStyle->getCellMargin());

o Dodavanje boje pozadine ćelije - U okviru iste klase dodat je kod za unos

boje pozadine ćelije. Prednost se daje boji trenutne ćelije. Ako ona nema

zadatu boju, koristi se boja pozadine čitave tabele. Sledi upis atributa za boju

pozadine:

$xmlWriter->writeAttribute('fo:background-color',

'#'.$style->getBgColor());

Atribut za boju prihvata isljučivo format sa “hash“ tagom pre konkretne

boje, što nije slučaj sa docx formatom.

o Dodavanje stila reda tabele - Dodata je klasa /Writer/ODText/Style/Row.

U okviru klase /Element/Row dodato polje $heightODT za čuvanje visine

reda tabele. Ovo je jedina opcija koju odt format dozvoljava u radu sa stilom

reda. Visina reda se upisuje se u okviru klase /Writer/ODText/Style/Row,

unutar tagova 'style:table-row-properties':

$xmlWriter->writeAttribute('style:min-row-height',

$style->getHeightODT());

o Dodavanje stila kolone tabele - Biblioteci je dodata klasa

/Writer/ODText/Style/Column sa implementacijom unosa širine kolone, što

je i jedina opcija za rad sa stilom kolone. Širina kolone se ne zadaje

eksplicitno, već pri kreiranju prve ćelije iz nove kolone, dolazi do kreiranja i

stila odgovarajuće kolone.

$table->addCell($width)->addText($text, $fStyle);

Kreiranje docx i odt dokumenata u programskom jeziku PHP

38

Ukoliko je ovo prva ćelija u novoj koloni, kreiraće se novi stil kolone.

Provera i upis stila kolone, ali i poziv funkcija za kreiranje stila ćelije dešava

se u klasi /Element/Table, unutar funkcije addCell():

Style::addColumnStyle($columnStyleName,

$styleOptions, $width);

Ime stila konkretne kolone formira se tako što se imenu trenutne tabele doda

string “.Columnn.$”, gde $ predstavlja redni broj kolone. Na ovaj način

obezbeđuje se jedinstvenost imena stila kolone, jer i sama tabela mora imati

jedinstveno ime.

o Dodavanje zasebnog stila prvog reda tabele - Pri kreiranju stila na nivou

cele tabele moţe se zadati stil prvog reda kao parametar.

$styleFirstRow=array('bgColor'

=> '66BBFF','borderColor' => '0000FF');

$styleTable = array('borderSize'=>20, 'borderColor'

=> '006699', 'cellMargin' => 80);

$PHPWord->addTableStyle('Fancy-Table', $styleTable,

$styleFirstRow);

Provere, i postavljanje atributa stila prvog reda odvija se u klasi

/Writer/ODText/Style/Cell. Tu se ispituje da li je podešen stil prvog rada, i

svakoj ćeliji koja tom redu pripada, dodeljuju se zadate opcije, u vidu

atributa.

o Spajanje ćelija po horizontali - Spajanje se zadaje unutar stila ćelije:

$gridSpan=array('gridSpan' => 3);

$table->addCell($width, $gridSpan)->addText($text,

$fStyle);

Unutar klase /Writer/ODText/Element/Table vrši se iteracija po svim

ćelijama tabele. Kada se dođe do ćelije koja ima zadat atribut “gridSpan“,

uzima se broj spojenih ćelija, i toliko sledećih ćelija se zamenjuje sledećim

elementom:

$xmlWriter->startElement('table:covered-table-cell'

);

Kreiranje docx i odt dokumenata u programskom jeziku PHP

39

Dodavanje niza reči sa različitim fontom u okviru istog paragrafa - Ciljna klasa

je /Writer/ODText/Element/TextRun. Primer kreiranja TextRun-a:

$textrun = $section->addTextRun('pStyle');

$textrun->addText($text, $fontStyle);

U polaznoj verziji klase /Writer/ODText/Element/TextRun, pri kreiranju paragrafa

ne dodaje mu se zadati stil kao atribut. Dodate sledeće linija koda:

$pstyle = $element->getParagraphStyle();

$xmlWriter->writeAttribute('text:style-name',$pstyle);

Dodavanje niza reči u okviru nabrajanja, sa različitim stilom fonta - Dodata

klasa /Writer/ODText/Element/ListItemRun. Sledi primer korišćenja ove klase:

$listItemRun = $section->addListItemRun();

$listItemRun->addText($text, $fontStyle);

Kako ovde nema više nivoa, dovoljno je ispitati da li je element početni, ili krajnji

u nabrajanju, zbog zatvaranja odgovarajućih tagova (isti tag kao kod klase

ListItem). Ako je element poslednji u nabrajanju, addListItemRun ima kao

prvi parametar true. Nazivi elemenata i atributa, kao i upis unutar xml fajla, su

analogni klasi ListItem.

Implementacija funkcionalnosti odt formata svodi se na programiranje pod

ograničenjima, gde mora da se prati logika zadata docx formatom. Mišljenja sam da je ova

biblioteka klasa prilagođena prevashodno docx dokumentima. Nije obraćena paţnja na

očigledne razlike između dva formata, koje nisu zanemarljive. Ovim izmenama, klasa

PHPWord dovedena je do nivoa gde se moţe kreirati potpun dokument, sa potpuno istim

izgledom u oba formata, i što je najvaţnije, pozivima istih funkcija.

Kreiranje docx i odt dokumenata u programskom jeziku PHP

40

Glava 8

Zaključak

U ovom radu je predstavljen istorijat programskog jezika PHP, njegov razvoj tokom

godina, i značaj u kreiranju veb aplikacija, kao i nastanak MVC okruţenja. Uvodi se pojam

XML fajlova i opis njihove strukture, jer su oni osnovni gradivni elementi tekstualnih

dokumenata, bilo da je to docx, ili odt format. Nakon toga sledi prikaz strukture docx i odt

dokumenata, i opis svih XML fajlova koji ulaze u kompresovani ZIP paket.

Na kraju je prikazana postojeća biblioteka PHPWord, njene mogućnosti i glavni

nedostaci, u vidu siromašne podrške za odt format u globalu. Podrška za docx dokumente je

jako dobra, mogu se kreirati i najsloţeniji dokumenti koristeći samo ovu biblioteku. Izmene

se odnose najvećim delom na granu za kreiranje odt fajlova, gde su mogućnosti blago

rečeno limitirane. Prikazana je svaka izmena postojeće PHPWord klase, kao i način na koji

je izmena izvršena. Ovako izmenjena klasa sada pruţa solidan izbor za rad sa docx i odt

dokumentima, i kreiranje identičnog sadrţaja pomoću istih funkcija.

Za eventualni dalji rad, pravac je jasan, a to je implementacija sloţenijih elemenata

u okviru odt formata, kao što su matematičke formule, grafički oblici, elementi forme, i

objekti u globalu. To bi upotpunilo klasu PHPWord, i ona bi verovatno postala prvi izbor

za kreiranje tekstualnih dokumenata u dva različita formata.

41

Literatura

[1] W. Jason Gilmore, Apress Beginning PHP and MySQL 5 From Novice to Professional

2nd Edition., 2006.

[2] Chris Pitt, Pro PHP MVC., 2012.

[3] Vikram Vaswani, Zend Framework: A Beginner's Guide., 2012.

[4] Wouter van Vugt, Open XML the Markup Explained., 2007.

[5] J. David Eisenberg, OASIS OpenDocument Essentials:Using OASIS OpenDocument

XML., 2005.

[6] Stephanie Krieger, Advanced Microsoft® Office Documents 2007 Edition Inside Out.,

2007.

[7] Vikram Vaswani, XML and PHP 1st Edition., 2002.

[8] PHP XMLWriter, PHP Official Documentation.

[Online].http://php.net/manual/en/book.xmlwriter.php

[9] (2002) OpenOffice.org XML File Format 1.0 Technical Reference Manual.

[10] ECMA Office Open XML (OOXML). [Online]. http://mashupguide.net/

Прилог 5/1

ПРИРОДНO - MАТЕМАТИЧКИ ФАКУЛТЕТ

НИШ

КЉУЧНА ДОКУМЕНТАЦИЈСКА ИНФОРМАЦИЈА

Редни број, РБР:

Идентификациони број, ИБР:

Тип документације, ТД: монографска

Тип записа, ТЗ: текстуални / графички

Врста рада, ВР: мастер рад

Аутор, АУ: Петар Ристовић

Ментор, МН: Марко Милошевић

Наслов рада, НР: Креирање доцx и одт докумената у програмском језику

ПХП

Језик публикације, ЈП: српски

Језик извода, ЈИ: енглески

Земља публиковања, ЗП: Р. Србија

Уже географско подручје, УГП: Р. Србија

Година, ГО: 2016.

Издавач, ИЗ: ауторски репринт

Место и адреса, МА: Ниш, Вишеградска 33.

Физички опис рада, ФО: (поглавља/страна/ цитата/табела/слика/графика/прилога)

44 стр.

Научна област, НО: информатика

Научна дисциплина, НД: информатика

Предметна одредница/Кључне речи, ПО: пхпворд, креирање одт и доцх докумената, xml језик

УДК 004.439PHP

Чува се, ЧУ: библиотека

Важна напомена, ВН:

Извод, ИЗ: У овом раду се описује генерисање текстуалних докумената помоћу библиотеке ПХПВорд, као и структура свих текстуалних фајлова. Представљене су сва побољшања библиотеке које рад обухвата, као и начин на који су измене извршене. На крају се даје путоказ за даљи рад, и комплетирање могућности које библиотека пружа

Датум прихватања теме, ДП: 15/03/2016

Датум одбране, ДО:

Чланови комисије, КО: Председник:

Члан:

Члан, ментор:

Образац Q4.09.13 - Издање 1

Прилог 5/2

ПРИРОДНО - МАТЕМАТИЧКИ ФАКУЛТЕТ

НИШ

KEY WORDS DOCUMENTATION

Accession number, ANO:

Identification number, INO:

Document type, DT: monograph

Type of record, TR: textual / graphic

Contents code, CC: university degree thesis

Author, AU: Petar Ristović

ć Mentor, MN: Marko Milošević

Title, TI:

Generating docx and odt documents in PHP

Language of text, LT: Serbian

Language of abstract, LA: English

Country of publication, CP: Republic of Serbia

Locality of publication, LP: Serbia

Publication year, PY: 2016

Publisher, PB: author’s reprint

Publication place, PP: Niš, Višegradska 33.

Physical description, PD: (chapters/pages/ref./tables/pictures/graphs/appendixes)

44 p.

Scientific field, SF: informatics

Scientific discipline, SD: informatics

Subject/Key words, S/KW: generating text documents, phpword, modifying xml files with php, odt, docx

UC 004.439PHP

Holding data, HD: library

Note, N: Abstract, AB: This thesis illustrates generating docx and odt files with

PHPWord library. It shows structure of every docx and odt document, as a set of xml files within a zipped folder. There are all changes made to library, so document could be generated with both docx and odt extensions, and have exactly the same content in both formats. At the end of thesis you can see what can be still improved, so PHPWord could generate more complex documents

Accepted by the Scientific Board on, ASB: 15/03/2016

Defended on, DE:

Defended Board, DB: President:

Member:

Member, Mentor:

Образац Q4.09.13 - Издање 1