UNIVERZITET U NIŠU PRIRODNO MATEMATIČKI FAKULTET …unarske... · kao u drugim programskim...
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