Mediu Interactiv Pentru Generarea Documentelor Pdf
Mediu interactiv pentru generarea documentelor PDF
REZUMATUL PROIECTULUI
Java PDF Export este o aplicație windows,în limbajul Java, care ne permite să inserăm sau sa redactăm articole,iar mai apoi să le generăm în documente PDF.Aceasta este ideea de bază de la care s-a plecat spre realizarea aplicației.Ulterior,au mai apărut o serie de funcționalități ce trebuiau implementate pentru a se ajunge la produsul final.Astfel că,pentru început,am realizat un Java GUI(Graphical User Interfaces) în care am creat o bară de meniu,unde urmau a fi pozitionate butoanele,și o fereastra,unde se putea scrie textul.Mi-am propus să realizez un editor de text prin care să pot creea,edita sau modifica fișiere text.Numarul de funcționalități ce trebuiau implementate au crescut,deoarece editorul trebuia să încarce fișiere text.Dupa ce am pus în balantă avantajele și dezavantajele tuturor formatelor am decis să folosesc formatul RTF.
Editorul Java PDF Export încarcă fișiere în format RTF care pot fi modificate și salvate inapoi in fișier ,sau în altul sub o altă denumire,sau pot fi generate într-un document PDF.Încărcarea fișierelor text se realizează prin apăsarea butonului „Open File” din bara de meniu.Prin apăsarea butonului „Save” putem salva textul într-un fișier RTF. Pentru a putea edita textul am decis ăa folosesc unelte pentru alegerea culorii si fontului,astfel că au mai apărut doua noi butoane in bara de meniu: „Font Chooser” si „Color Chooser”.
Utilizatorii care vor folosi editorul Java PDF Export pot scrie orice tip de text în care pot modifica fontul culoarea dupa bunul plac,ba chiar pot adauga imagini sau ilustrații după caz.Acest lucru se poate realiza prin apăsarea butonului din bara de meniu: „Insert Image”.
In cele din urmă,dupa ce utilizatorul redactează sau inserează text are posibilitatea de a genera un document PDF.Acest fapt va fi efectuat prin apasarea butonului: „Export To PDF”.
CUPRINSUL
1 INTRODUCERE
1.1 SCOPUL
1.2 MOTIVAȚIA
2 DESCRIEREA SI ANALIZA CERINTELOR
2.1 CERINȚE GENERALE
2.2 NOTIUNEA DE EDITOR DE TEXT
2.3 NOTIUNEA DE JAR
3 ASPECTE TEORETICE SI TEHNOLOGII
3.1 JAVA
3.2 ECLIPSE
3.3 iText
3.4 Adobe PDF
3.4.1 PDF 1.7
3.4.2 PDF 2.0
3.5 RTF
4 IMPLEMENTAREA APLICATIEI
4.1 ARHITECURA APLICATIEI
4.2 DESCRIEREA DETALIATA A APLICATIEI
4.3 DESCRIEREA CLASELOR APLICATIEI
4.4 MANUAL DE UTILIZARE
4 CONCLUZII
5 BIBLIOGRAFIE
6 REFERINȚE WEB
A. CODUL SURSĂ
B. CD / DVD
INDEX
LISTA FIGURILOR
Figura 1. Selectarea prin click dreapta a opțiunii „Update field” 5
Figura 2. Actualizarea întregului tabel 5
LISTA TABELELOR
Tabelul 1. Nume de utilizatori și valorile rezumat ale parolelor acestora 5
Introducere
Scopul
Java PDF Export este mediul propice unde orice utilizator de Microsoft Windows poate redacta sau insera paragrafe sau fragmente în scopul de a le genera intr-un PDF.
Ce este un PDF?
PDF (Portable Document Format) este un document în format portabil creat de Adobe pentru a ușura schimbul de documente.
Java PDF Export este un generator de PDF-uri,care,odata instalat oferă posibiliatea conversiei documentelor RTF în documente în format PDF.Crearea unui document PDF cu ajutorul aplicației Java PDF Export devine tot mai simplă comparativ cu alte programe care au fost construite în acelasi scop.Astfel că,odată introdus textul în fereasta principală este nevoie de un singur click pentru a genera un PDF.Nu ramane decat să alegem locația unde dorim ca acesta să fie salvat și tot procesul ajunge la final într-un timp foarte scurt.
Scopul principal a fost acela de a realiza o aplicație windows care să fie accesibilă la scară largă indiferent de nivelul de pregatire al persoanelor care beneficiază de creatorul de PDF-uri.Astfel,pentru a cuprinde o gamă cat mai vastă de utilizatori trasăturile distinctive ale programului sunt simplitatea cu care este ușor de utilizat si rapiditatea cu care se executa generarea unui PDF.Totodata sunt mai multe caracteristici care întregesc aplicația și o plasează în topul produselor de creatoare PDF.
Motivația
Aplicația Java PDF Export a fost creată din dorința de a implementa in Eclipse un convertor PDF sub forma de aplicație windows.Am hotarat să realizez acest proiect pentru a ma familiariza cu modul de implementare a aplicațiilor software.
Am ales să realizez aplicația cu titlul : „Mediu interactiv pentu generarea documentelor PDF” deoarece am dorit sa creez un program care să fie accesibil tuturor tipurilor de utilizatori,indiferent dacă sunt avizați sau nu,în intrebuințarea computerelor.
Am analizat aplicațiile existente pe piața care au același scop cu Java PDF Export și am decis că aplicația mea să aibă urmatoarele caracteristici:
-simplitate si rapiditate: Utilizatorul adaugă text în fereastra principală din fișier sau scris de la tastatura,apasă butonul „Export To PDF”,selectează locația și ,cat să un iți dai seama, documentul în format PDF a fost creat.
-editor de text: Utilizatorul poate scrie paragrafe,articole,etc de la tastatura ce pot fi tiparite dupa bunul plac cu privire la dimensiune,font sau culoare.
-suport pe 32/64 de biti: Poate fi folosit atat pe sisteme de operate de 32 de biți cat și pe sisteme de operare de 64 de biți,
-fara programe aditionale: Nu necesita instalare unui alt program sumplimentar pentru generarea PDF-urilor.
-portabil: Poate fi transferat pe orice tip de memorie externa (memorii USB,carduri de memorie,etc) deoarece are o dimensiune mica in comparație cu alte programe similare.
-utilizeaza putine resurse: Comparativ cu alte creatoare PDF,Java PDF Export consumă foarte puțin din resursele calculatorului,iar performanța acestuia nu este afectată în timpul conversiei.
Motivația principală a fost dobandirea experienței în utilizarea tehnologiilor open-source,foarte des folosite la scară mondială,intr-o gamă vastă de aplicații Java.
Descrierea si analiza cerintelor
Cerinte generale
Dorim să implementăm o aplicație windows de care să beneficieze o scară cat mai largă de utilizatori și să le permită acestora să creeze ușor și rapid documente în format PDF. Aplicația urmează să fie implementată în Java.
Aplicația va dispune de o fereastră principală în care se va putea scrie text de la tastaură,deasupra ferestrei principale va exista un meniu cu butoane.Butonul principal va fi “Export To PDF”.
Utilizatorii aplicaăiei vor avea posibilitatea de a încarca fișiere de tip RTF,de a le vizualiza si de a le modifica.Astfel,vom dispune de un editor de text în care utilizatorilor li se vor permite lucrul cu texte.
Ce este un editor de text?
“Definiție: EDITOR DE TEXT = este un program care permite lucrul cu texte.Operațiile de editare sunt: introducerea de text,ștergerea,modificarea aspectului unei porțiuni din text (formatarea) și copierea unei porțiuni de text.”
La baza,un editor de text este o aplicație software.Aceasta este folosită pentru editarea (crearea sau modificarea) de fișiere text.Pentru a ne da seama cum functioneazș acest lucru ne vom familiariza cu cațiva termeni care intervin în lucrul cu editoarele de text:
-formatare
-document
-caracter
-stil de character
-font
-paragraf
“Definiție: FORMATAREA = este modificarea aspectului unui text sau unei imagini, unui grafic, etc., conform anumitor standarde. De exemplu, formatarea unui cuvânt înseamna modificarea înalțimii literelor, a culorii etc. iar formatarea unei linii presupune modificarea grosimii, adaugarea unor efecte de umbrire, etc.
Definiție: DOCUMENT = Este un fișier al carui conținut este creat de utilizatori. Dosarul în care apar de obicei documentele unui utilizator se numeste My Documents (Documentele mele).
Definiție: CARACTER = Un simbol introdus de la tastatura se numeste caracter . Caracterele pot fi: litere, cifre, semne de punctuatie, simboluri speciale, etc.
Definiție: STIL DE CARACTER = este unul din urmatoarele: Bold (Îngrosat), Italic (Înclinat) si Underline (Subliniat) sau o combinatie dintre acestea. De exemplu, cuvântul “inițiere” poate fi scris cu diferite stiluri: inițiere- inițiere- inițiere-ințtiere
Definiție: FONT – este o colectie de caractere (litere, numere și simboluri) cu aspect unitar. Fonturile sunt fișiere în dosarul Fonts din C:\Windows. Ex: Times New Roman, Arial, Verdana, etc. Iata, în continuare, cuvântul “inițiere” scris cu trei fonturi:
Inițiere (fontul: Arial)
inițiere (fontul: Times New Roman)
inițiere (fontul: Courier New).
Definiție: PARAGRAF – este textul aflat între doua marcaje de sfârsit de paragraf. Tastând ENTER introducem în document caracterul invizibil ¶ ( sfârsit de paragraf ) care determină sfârșitul paragrafului curent, cursorul deplasându-se pe rândul urmator.
Într-un paragraf, pe masura ce scriem, textul se încadrează automat între marginile paginii (sus, jos, stânga si dreapta) precum apa care umple un vas – proces numit curgerea textului (text flow).”
Aplicația va fi un fișier executabil de tip JAR.
Ce este un JAR ?
Formatul JAR (Java Arhive) permite încapsularea mai multor fișiere într-o singură arhivă.Un fișier JAR poate conține fișiere .class dar și alte fișiere auxiliare(text,fișiere audio,imagini,etc)
Fișierele JAR sunt fișiere de arhivă.constuite pe formatul ZIP și au extensia .jar. Utilizatorii pot crea fișiere JAR folosind comanda care vine cu un JDK.Formatul JAR a fost constuit de cate SUN. Pentru inceput,a aparut prima versiune a JDK(Java Development Kit) care se numea JDF Alpha and Beta aparută pe piată in anul 1995.Ulterior,au aparut noi versiuni cu numeroase imbunatatiri:
-JDK 1.0 apărut in data de 23 ianuarie 1996
-JDK 1.1 apărut in data de 19 februarie 1997
-J2SE 1.2 apărut in data de 9 decembrie 1998
-J2SE 1.3 apărut in data de 8 mai 2000
-J2SE 1.4 apărut in data de 6 februarie 2002
-J2SE 5.0 apărut in data de 30 septembrie 2004
-Java SE 6 apărut in data de 11 decembrie 2006
-Java SE 7 apărut in data de 28 iulie 2011
-Java SE 8 apărut in data de 18 martie 2014
-Java SE 9 se speculeaza ca avand data de aparitie in anul 2016.
Intrucat JDK a suferit noi modificari din 1995 pana in 2014 s-a remarcat prin urmatoarele caracteristici:
-Securitate: un fișier JAR poate fi semnat digital,astfel încat numai utilizatorii care cunosc semnatura pot avea privilegii de securitate.
-Timp de descarcare scazut: în cazul în care fișierele unui aplet (inclusive cele auxiliare) sunt încapsulate într-un fisier , atunci acesta poate fi descarcat de browser intr-o singură tranzactâție HTTP(stim că pentru orice fișier pe care browserul trebuie să îl aducă pe server se realizează o altă conexiune TCP).
-Compresie: JAR-urile pot fi comprimate cu formatul ZIP
-Sigilarea pachetelor: această carcteristică a fost utilizată numai după versiunea 1.2. Prin sigilarea pachetelor înțelegem că toate fișierele definite în pachetul respectiv trebuie să se gasească același fișier JAR pentru ca toate sa fie interpretate cu aceeasi versiune de Java.
-Detalii privinde versiunea pachetului: fișierele JAR pot pastra date despre fișierele pe care le cotine(ex: versiunea,producatorul,etc).
-Portabilitate: această caracteristică este utilizata limbajului Java în general. Mecansimul de arhivare este o parte standard a platformei Java API.
Fișierele JAR sunt arhive în formatul ZIP și pastrează caractesiticile acestuia:
-compresia datelor fară a pierde de informații
-arhivare
-decompresie.
Pe langa fișierele arhivate,JAR-ul conține un director numit META-INF,ce contine diferite informații auxiliare.META-INF este un fițier opțional care poate stabili cum poate fi folosit fișierul JAR.
Operații principale în lucrul cu fișiere JAR în mediul Java:
Una dintre cele mai importante caracteristici ale unui fișier JAR este semnatură digitală.Astfel că,în cele ce urmează vom analiza în profunzime subiectul:semnarea și verificarea fișierelor JAR.
Fișierele JAR pot fi sigilate cu o semnatură electronică. Motivul pentru care vom semna un fișier este acelasi cu motivupresie.
Pe langa fișierele arhivate,JAR-ul conține un director numit META-INF,ce contine diferite informații auxiliare.META-INF este un fițier opțional care poate stabili cum poate fi folosit fișierul JAR.
Operații principale în lucrul cu fișiere JAR în mediul Java:
Una dintre cele mai importante caracteristici ale unui fișier JAR este semnatură digitală.Astfel că,în cele ce urmează vom analiza în profunzime subiectul:semnarea și verificarea fișierelor JAR.
Fișierele JAR pot fi sigilate cu o semnatură electronică. Motivul pentru care vom semna un fișier este acelasi cu motivul semnarii unui document scris pe hartie.Adica,citiorii care recunosc semnatura trebuie sa știe cine este autorul documentului.Procesul prin care se recunoaște semnatura se numeste verificare.
Daca clientul recunoaște un document semnat are posibilitatea de a trece peste privilegiile de securitate si va avea libertatea de a executa operații asupra documentului.
În Java,semnarea și verificarea,se face prin utilizarea unor chei special:cheia pubică și cheia privată.Cele 2 chei sunt complentare.
Cheia privata este un ‘stilou electronic’ și este stiut numai de administratorul care a realizat semnatura.Fișierul care a fost semnat cu o cheie privata poate fi verificat numai cu cheia publică corespunzatoare.
Atunci cand un fisier JAR este semnat,cheia publica va fi plasata în interiorul arhivei disponibil cu certificatul,pentru ca sa poate fi verificata semnatura de un potential client.
Astfel cand autorul semneaza un fișier JAR procedeaza astfel:
-semneaza fișierul folosind cheia privată
-cheia publică va fi plasată în arhiva impreuna cu certificatul
Simultan cu semnarea fișierului JAR,un fișier este generat și trimis în META-INF,acelasi cu directorul fisierului manifest.Fișierele semnatură cu extensia .SF conțin coduri pentru fișierele din arhivă.Aceleași intrari se gasesc si în fișierul manifest.
Exemplu:
Name: issa/usr/user.class
SHA1-Digest : bHSKHgdshdscs2hu68=
Atunci cand fișierul JAR este verificat, codul fiecarui fișier este recalculat și comparat cu cel din fișierul manifest, pentru a asigura faptul că arhiva nu a fost schimbată atunci cand a fost semnată.
Pentru semnarea si verificarea arhivelor folosim JDK 1.2 ofera utilitarul jarsigner :
jarsigner fisier_jar alias
-alias = fișierul unde se află cheia privată cu care se va semna.
Verificarea unei arhive semnate:
jarsigner -verify fisier_jar
Daca verificarea se incheie cu succes, se va afișa mesajul:
jar verified
Daca nu, se va afișa mesajul :
jar is unsigned. (signature missing or not parsable)
Aspecte teoretice si tehnologii
Java
Java este o tehnologie inovatoare bazata pe programare orientata obiecte,conceputa de James Glosing si lansată de compania Sun Microsystems în anul 1995.Limbajul de programare Java a avut un impact remarcabil asupra intregii comunitati a dezvoltatorilor de software.Principalele caracteristici ale acestui limbaj sunt simplitatea,robustetea si portabilitatea.Initial denumita OAK, tehnologia Java este un limbaj de programare de nivel inalt pe baza caruia s-au intemeiat o serie de platforme destinate implementarii de aplicatii distribuite.
Limbajul Java a devenit la scurt timp dupa lansare unul dintre cele mai populare optiuni pentru dezvoltarea de aplicatii.Astfel,putem remarca cateva caracteristici distinctive in raport cu alte limbaje actuale:
-Simplitate – elimina mostenirea multipla si suprancarcarea operatorilor
-Usurinta in producerea de aplicati complicate.
-Robustete – elimina erori ce apar deseori in programare relative la pointeri,administrarea automata a memoriei si elimina pierderile de memorie
-Complet orientat pe obiecte – dispare stilul de programare procedural
-Securitate – este un limbaj sigur,impune reguli stricte in rularea proceselor la distanta
– Neutralitate arhitecturala – aplicatia Java ruleaza in mod normal indiferent de masina fizica pe care este conceputa
-Portabilitate – desi o aplicatie poate fi creata pe o platforma instalata pe un anumit sistem de operare,aceasta poate rula si pe alte sisteme de operare(Windows,Linux,Solaris,Mac OS,etc) fara sa fie recompilata.
-Performanta – Java asigura o performanta ridicata a codului pe octeti,astfel incat viteza de lucru putin mai scazuta nu va fi un impediment in producerea de aplicatii complexe.
-Modelat dupa C si C++ – intre C,C++ si Java nu este o diferenta foarte ridicata.
Limbajul Java impreuna cu mediu de dezvoltare au fost create pentru a rezolva unele dintre problemele cu care se confruntau celelalte limbaje de programare.Proiectul Java a pornit din dorinta de a exista un software performant pentru crearta de aplicatii complexe realizate intr-un mod mai simplu.Desi,initial a fost folosit limbajul C++,cand s-a incercat dezvoltarea unui mediu de executie care sa respecte noile conditii s-a observat ca o serie de trasaturi ale limbajului C++ nu respecta necesitatile declarate.C++ este un limbaj complicat,deoarece foloseste prea multe conventii.
Java,spre deosebire de celelalte limbare,incearca sa fie un limbaj simplu de utilizat chiar si de catre programatorii incepatori ce se concentreaza asupra aplicatiilor si abia apoi asupra tehnicilor de implementare.Comparativ cu C++,Java elimina supraincarcarea operatorilor cat si mostenirea multipla.In Java a fost introdus un colector de gunoaie care sa resolve problema dealocarii memoriei, fara interventia programatorului.
Java este independent de arhitectura calculatorului pe care ruleaza. Spre deosebire de alt limbaj acesta nu genereza cod pentru fiecare platforma. Compilatorul Java generează o secvență de instrucțiuni ale unei mașini virtuale Java. Execuția programelor Java este interpretată. Pentru ca Java sa ruleze de pe o arhitectura pe alta trebuie portat mediul de executie cuprinzand interpretorul si cateva din bibliotecile standard care depind de system.Astfel,aplicatii Java compilate pe o anume arhitectura pot rulafara recompliare si pe alte tipuri de arhitecuri.
Problema limbajelor de programare interpretate este viteza de execuție, scăzută față de cea a limbajelor compilate. Dacă viteza de execuție a unei astfel de aplicații este mult prea lenta puteți seta din mediului de execuție Java sa lucreze simultan cu masina fizica pe care se lucreaza, obținându-se astfel un fir executabil natural care ruleaza la viteză maximă. De obicei,Java compilează doar acele părți ale programului mari consumatoare de timp, restul partilor rămân interpretate pentru a nu se pierde flexibilitatea. Mediul de execuție este scris în limbajul C ceea ce îl face extrem de portabil.
Limbajul Java este orientat obiect,deci putem crea clase de obiecte și instanțe ale acestora, putem încapsula informațiile, putem moșteni variabilele și metodele de la o clasă la alta, etc. Trăsătura specifică limbajelor orientate obiect este aceea ca lipsește este moștenirea multiplă, dar Java oferă o facilitate simplă, denumită interfață, ce permite definirea unui anumit comportament pentru o clasă de obiecte, altul decât cel determinat de clasa de bază. In Java fiecare element este un obiect în afară de datele primare. Din Java sunt eliminate funcțiile și variabilele globale,dar rămân metodele și variabilele statice ale claselor.
Limbajul Java este distribuit.Sunt implementate biblioteci pentru lucrul în rețea care ne oferă protocoale TCP/IP, protocoale URL și încărcarea resurselor din rețea. Programele realizate in Java pot accesa ușor rețeaua, trimitiand apeluri către un set standard de clase.
Limbajul Java este robust. Java leaga funcțiile în timpul execuției și informațiile de compilare sunt disponibile până la momentul rulării programului. Java identifică referințele nule dacă sunt folosite în operații de acces.Pointerii lipsesc cu desavarsire din limbajul Java, împreună cu întreaga lor aritmetică, astfel se elimina una din principalele surse de erori.Eliberarea memoriei cu care se ocupa obiectele și tablourile se face automat cu ajutorul mecanismului de colectare de gunoaie. Astfel se evita încercările de eliberare multiplă a unei zone de memorie.
Limbajul Java are un nivel de securitate ridicată. Java verifică la fiecare încărcare codul prin mecanisme de CRC. Robustețea este o trăsătură de securitate. La un al doilea nivel, Java ofera protecție a obiectelor din sistem la scriere și citire. Variabilele protejate într-un obiect nu pot fi accesate fără a avea drepturile necesare, verificarea este făcută în timpul execuției. Mediul de execuție Java poate fi configurat pentru a proteja rețeaua locală, fișierele și alte resurse ale calculatorului pe care rulează o aplicație Java.
Aplicatiile din Java lucreaza cu mai multe fire de executie.Acest suport este autonom fata de sistemul de operare,dar poate lucre simultan cu sistemul pentru o performanta mai buna.
Java este dinamic. Bibliotecile de clase în Java se pot reutiliza cu ușurință. Astfel,problema fragilității superclasei este rezolvată.In C++, dacă o superclasă este modificată, toate subclasele trebuie recompilate pentru că obiectele vor aveao alta structură în memorie. În Java variabilele se leaga doar la execuție. In Java,gasirea variabilelor se face dupa nume și nu prin deplasament fix precum in C++. Astfel,se elimina necesitatea actualizării programelor, generată de apariția unei noi versiuni de bibliotecă așa cum se întâmplă cu MFC-ul Microsoft (și toate celelalte ierarhii C++).
Eclipse
In noiembrie 1998 IBM Software Groupa pus bazele unei platforme de dezvoltare care,in cele din urma,a devenit cunoscuta sub numele de Eclipse.La inceput a fost construit Java IDE in laboratoarele centrului numit Object Technology International (OTI).Echipa OTI a avut o experienta vasta in construirea mai multor generatii de IDE-uri in formule mai mici de ingineri,de inalta calificare.In acelasi timp,IBM a adunat echipe suplimentare pentru a creea produse de top pentru aceasta platforma.Se estimeaza ca IBM a investit déjà 40 milioane de dolari la acea vreme. Membrii originali au fost:
-Borland
-IBM
-Merant
-QNX Software Systems
-Rational Software
-Red Hat
-SuSE
-TogetherSoft
-WebGain.
In noiembrie 2001,Eclipse a devenit un mediu de dezvoltare open-source pentru a fi promovat. Astfel,a fost adoptat de catre IBM si alte opt organizatii care si-au luat angajamentul de a utilize Eclipse pe plan intern.
Pana in anul 2003,primele versiuni majore ale Eclipse au fost bine primite si au fost adoptate puternic de catre dezvoltatori.La inceput analistii sin industrie au perceput mediul de dezvotare Eclipse ca fiind controlat de catre IBM.Dar odata cu aparitia organizatiei non-profit EclipseCon 2004 companiile au inteles ca Eclipse devine un mediu de dezvoltare independent.
In tabelul de mai jos sunt prezentate versiunile Eclipse din 2004 pana in 2015:
Eclipse este un mediu de dezvoltare open-source scris in mare parte in Java.Exlipse este un mediu de dezvoltare integrat(IDE) si poate fi utilizat in dezvoltarea de aplicatii.De asemenea,in Eclipse se pot implementa si alte limbaje de programare precum:
-Ada
-ABAP
-C/C++
-COBOL
-Fortran
-Haskell
-JavaScript
-Lasso
-Natural
-Perl
-PHP
-Prolog
-Python
-R
-Ruby(inclusive Ruby on Rails)
-Scala
-Clojure
-Groovy
-Erlang
-Scheme.
Eclipse foloseste plug-in-uri,adica accesorii prin care isi extinde functionalitatea.Eclipse este extinsa si cu ajutorul altor limbaje de programare cum ar fi C si Python,cadrul de plug-in ii permite platformei sa lucreze cu retele de aplicatii,cum ar fi Telnet si de gestionare a bazelor de date.
Cu exceptia nucleului,totul in Eclipse este un plug-in.Mediul de dezvoltare ofera plug-in-uri pentru o mare varietate de caracteristici,unele gratuite,altele comerciale.
Eclipse ofera platforma RCP (client bogati) pentru dezvoltarea de aplicatii de un general . Urmatoarele component constituie platform clientilor bogati:
-Equinox OSGi – cadru de grupare standard
-Platforma Core – boot Eclipse
-Standard Widget Toolkit (SWT) – un set de instrumente widget portabil
-JFace – cursuri de vizualizare pentru a aduce in vedere modelul de programare controler de SWT, tampoane de fișiere, de manipulare text, editoare de text.
– Eclipse Workbench – opinii, editori, perspective.
Eclipse este platforma server deoarece sprijină dezvoltarea de Tomcat, GlassFish și multe alte servere și este adesea capabil de instalarea serverului necesar (pentru dezvoltare), direct de la IDE. Acesta susține depanarea la distanță, permițând utilizatorului să urmărească variabile și pas prin codul de o aplicație care rulează pe serverul de atașat.
Proiectul Eclipse Web Tools Platform (WTP) este o extensie a platformei Eclipse cu instrumente pentru dezvoltarea de aplicații web și Java EE. Acesta include sursă și editori grafice pentru o varietate de limbi,aplicații încorporate pentru a simplifica dezvoltarea, precum și instrumente și API-uri pentru a sprijini implementarea, de funcționare, și testarea aplicații.
Proiectul de modelare contine toate proiectele oficiale ale Fundației Eclipse concentrându-se pe tehnologii de dezvoltare bazate pe modele. Acestea sunt toate compatibile cu cadrul Modeling Eclipse creat de IBM.
iText
iText este o bibliotecă open source folosit pentru crearea și manipularea de fișiere PDF în Java. Acesta a fost scrisa de către Bruno Lowagie, Paulo Soares, și alții. Data aparitiei a fost in anul 2001 si a fost realizat din mai mult de 1 milion de linii de cod. iText are un cod bine stabilit menținut de către o echipă de dezvoltare mare.
Începând cu versiunea 5.0.0 (lansata in data de 7 decembrie 2009) iText este distribuit sub versiunea License Affero General Public.Trei versiuni anterioare ale iText (Java până la 4.2.1 și C # până la 4.1.6) au fost distribuite sub licenta Mozilla Public sau LGPL. iText este de asemenea disponibil prin intermediul unei licențe de proprietate, distribuite prin iText Software Corp iText este o marcă înregistrată de către 1T3XT BVBA.
Există două cărți despre iText, scrise de creatorul original al software-ului. În prima ediție a "iText în acțiune", cititorii afla de ce lucrurile merg așa cum au făcut în iText, completata cu exemple simple. A doua ediție sunt adaugate mai multe exemple din viața reală. Unele cărți noi sunt în curs de dezvoltare. Acestea vor fi disponibile gratuit pe Leanpub.
iText a fost adaptată pentru .NET Framework sub numele de iTextSharp. iTextSharp este scris în C # și are o cod separat, dar este sincronizat cu iTex. Toate exemplele din cea de a doua carte au fost portate în C #, dar puteți găsi, de asemenea, o mare varietate de mostre de cod scrise de diferiti dezvoltatori.
Până la jumătatea anului 2013,iText (Java) și iTextSharp (NET) a fost descărcat de pe SourceForge de peste 5 milioane de ori. În octombrie 2013 download-uri de iText din SourceForge au fost de aproximativ 3.000 pe săptămână în timp ce download-uri iTextSharp au fost de aproximativ 4.000 pe săptămână
Dezvoltatorii pot folosi iText pentru:
-a genera dinamic documente PDF din fișier XML sau baze de date
-a servi PDF la un browser
-a utiliza mai multe caracteristici interactive PDF-lui
-a adauga marcaje, numere de pagină, filigrane, coduri de bare, etc
-a înlănțui și manipula pagini PDF
-automatizarea completarii formularelor PDF
-a adauga semnături digitale într-un fișier PDF
De obicei, iText este folosit în proiecte care au una dintre următoarele cerințe:
-conținutul nu este disponibil: este calculat pe baza informatiilor introduse de utilizator sau informații de baze de date în timp real.
-fișierele PDF nu pot fi produse manual, adică au un volum mare de conținut: un număr mare de pagini sau documente.
-documentele trebuie să fie create în mod nesupravegheat.
-conținutul trebuie să fie personalizat;de exemplu, numele de utilizator trebuie să fie imprimat pe un număr de pagini.
In unele situatii putem întâlni aceste cerințe în aplicațiile web,în cazul în care conținutul trebuie să fie difuzat în mod dinamic la un browser. În mod normal aceste informații ar trebui sa apara în formă de HTML. PDF-ul este preferat de HTML deoarece prezinta o calitate mai bună de imprimare, de reprezentare pe o varietate de platforme, pentru motive de securitate, sau pentru a reduce dimensiunea fișierului.
iText oferă suport pentru funcțiile mai avansate ale PDF-urilor,cum ar fi semnăturile PKI bazate pe, criptare pe 40 de biți și 128 de biți, corecție a culorii, Tagged PDF, formulare PDF (AcroForms), PDF / X, gestionarea culorilor prin profile ICC și coduri de bare.
Suport de standarde ISO :
-ISO 32000-1 (PDF 1.7)
-ISO 19005 (PDF / A)
-ISO 14289 (PDF / UA)
Bruno Lowagie a dezvoltat o biblioteca PDF în iarna anului 1998 ca proiect local la Universitatea din Gent. Biblioteca (cunoscut anterior ca rugPdf) a fost o bibliotecă foarte mica și complexa cu funcționalitate minima,cum ar fi pur și simplu citirea și scrierea fișierelor PDF.. Leonard Rosenthol,arhitect la Adobe, enumeră iText ca una dintre primele pietre de hotar din istoria de deschidere a PDF.
În 1999, Lowagie a scris o bibliotecă nouă, iText, de la zero. Lowagie creat iText ca o bibliotecă pe care dezvoltatorii Java pot folosi pentru a crea documente PDF și a lansat-o gratuit ca software open-source, produs pe 14 februarie, 2000 În vara anului 2000, Paulo Soares alăturat proiectului și este în prezent unul dintre principalii dezvoltatori de caracteristici noi iText.
În 2006, o primă carte a fost publicată "iText în acțiune, crearea si manipularea fisierelor PDF", din care mai mult de 11.500 de exemplare au fost vândute. Matt Stephens a menționat iText ca fiind unul dintre "secretele cel mai bine păstrate" Java.
În 2010, afost lansata a doua ediție a cărții "iText în acțiune". A fost o rescriere completă cu noi exemple. [26]
În 2013, Deloitte nominalizat Software Group iText pentru Technology Fast 50 Award în Benelux. Compania a fost clasata pe locul al 10-lea în Benelux și a treia în Belgia.
Adobe PDF
Portable Document Format (PDF) este un format de fișier folosit pentru a prezenta documentele într-un mod independent de sisteme software de aplicație, hardware, și de exploatare. Fiecare fișier PDF incadrează o descriere completă a unui document, inclusiv textul, fonturi, grafică și alte informații necesare pentru a se afișa. În 1991, Adobe Systems co-fondator John Warnock a prezentat un sistem numit "Camelot" ,care a evoluat în PDF.
În timp ce Adobe Systems a făcut caietul de sarcini PDF disponibil gratuit în 1993, PDF a fost un format proprietar, controlat de Adobe, până când a fost lansat oficial ca un standard deschis, la 1 iulie 2008 și publicat de Organizația Internațională de Standardizare ISO 32000-1. Există unele tehnologii referite de către ISO 32000-1, care pot fi încorporate în fișiere PDF cum ar fi Adobe Forms XML, și JavaScript pentru Acrobat.
PDF a fost dezvoltat la începutul anilor 1990 ca o modalitate de a partaja documente, inclusiv formatarea textului și imagini in paragrapf.La inceput formatul PDF era destul de lent pentru citirea si crearea de fisiere PDF.
Din 1993-2006 Adobe Systems a schimbat caietul de sarcini formatului PDF de mai multe ori pentru a adăuga noi caracteristici. Diferite aspecte ale nivelului de extensie Adobe publicate după 2006 au fost acceptate în proiecte de lucru din ISO 32000-2 (PDF 2.0), dar dezvoltatorii sunt avertizați că extensiile Adobe nu sunt parte a standardului PDF.
Standardului ISO 32000-1: 2008 și Adobe PDF 1.7 sunt în concordanță din punct de vedere tehnic. Versiunile viitoare ale formatului PDF vor fi produs de către comitetele tehnice ISO.
Următoarele subseturi de specialitate din caietul de sarcini PDF a fost standardizat ca standardele ISO (sau sunt în proces de standardizare):
-PDF / X (din 2001 – serie de ISO 15929 și ISO 15930 de standarde) – alias "PDF for Exchange" – pentru tehnologie grafica – Prepress de schimb de date digitale – (lucru în ISO comitet tehnic 130), bazat pe PDF 1.3, PDF 1.4 și mai târziu, de asemenea, PDF 1.6
-PDF / A (din 2005 – serie de ISO 19005 standarde) – aka "PDF pentru Archive" – Managementul documentelor – format de fișier electronic pentru conservarea pe termen lung (de lucru în ISO comitet tehnic 171), bazat pe PDF 1.4 și mai târziu, de asemenea, ISO 32000-1 – PDF 1.7
-PDF / E (din 2008 – ISO 24517) – alias "PDF pentru Inginerie" – Managementul documentelor – format de document Inginerie folosind PDF (care lucrează în ISO comitet tehnic 171), bazat pe PDF 1.6
-PDF / VT (din 2010 – ISO 16612-2) – alias "PDF pentru schimbul de date variabile și tranzacționale (VT) de tipar" – tehnologie grafica – schimb de date variabile (de lucru în ISO comitet tehnic 130), bazate pe PDF 1.6 restricționate de PDF / X-4 și PDF / X-5
-PDF / UA (din 2012 – ISO 14289-1) – alias "PDF pentru accesibilității universale" – aplicații de management al documentelor – document de Electronic accesoriu format de fișier pentru accesibilitate (de lucru în ISO comitet tehnic 171), bazat pe ISO 32000-1 – PDF 1.7 .
Există, de asemenea, PDF / H, aka PDF Healthcare, un ghid de bune practici (BPG), completat de un ghid de implementare (IG), publicat în 2008, PDF Healthcare nu este un standard, ci doar un ghid pentru utilizarea cu standardele existente și alte tehnologii. Acesta este sprijinit de ASTM organizații de dezvoltare a standardelor și AIIM. PDF / H BPG este bazat pe PDF 1.6.
PDF 1.7
Documentația finală revizuită pentru PDF 1.7 a fost aprobat de către Comitetul Tehnic ISO 171 în ianuarie 2008 și publicat ca ISO 32000-1: 2008 de la 1 iulie 2008 și intitulat Managementul documentelor – format de document portabil – Partea 1: PDF 1.7.
ISO 32000-1: 2008 este primul standard ISO pentru funcția de format PDF. ISO 32000-1 include toate funcționalitățile din caietul de sarcini Adobe PDF pentru versiunile 1.0 prin intermediul 1.6. Adobe a eliminat anumite caracteristici ale PDF din versiunile anterioare; aceste caracteristici nu sunt incluse în PDF 1.7.
Documentul ISO 32000-1 a fost pregătit de către Adobe Systems Incorporated bazat pe PDF Reference, ediția a șasea, Adobe Portable Document Format versiunea 1.7, noiembrie 2006 a fost revizuit, editat și adoptat de Comitetul Tehnic ISO 171 (ISO / TC 171), Document aplicatie de gestiune, Subcomisia SC 2, probleme de aplicare, în paralel cu aprobarea sa de către organismele membre ISO.
Potrivit rezumatului standardul ISO PDF: ISO 32000-1: 2008 prevede o formă digitală pentru reprezentarea documentelor electronice pentru a permite utilizatorilor să facă schimb și sa vizualizeze documente electronice independente de mediul în care au fost create sau mediul în care sunt vizualizate sau imprimate . 32000-1:2008 este destinat pentru dezvoltatorii de software care creează fișiere PDF.
Unele specificații de proprietate aflate sub controlul Adobe Systems (de exemplu, Adobe Acrobat JavaScript sau forme XML Architecture) sunt în referințele normative ale ISO 32000-1 și sunt indispensabile pentru aplicarea ISO 32000-1
PDF 2.0
O noua versiune a standardului PDF este în curs de dezvoltare sub numele de ISO / CD 32000-2 – Managementul documentelor – format de document portabil – Partea 2:. PDF 2.0 (din august 2013) PDF 2.0 a fost acceptată de către ISO ca o nouă propunere în 2009 (ISO / NP 32000-2).TC 171 SC 2 WG 8 Comitetul de lucru pe ISO 32000-2 (PDF 2.0) continuă să se dezvolte în mod activ.Pentru a oferi mai mult timp pentru a se dezvolta documentul proiectului ISO original a fost anulat în 2012 (în "faza de cercetare" ca un "proiect de standard internațional"), și un element nou proiect a fost început.
Adobe a depus Adobe Extension nivelul 5 și Adobe Extension de nivel 3 specificațiile ISO pentru includerea în caietul de sarcini ISO 32000-2, dar numai o parte din caracteristicile lor au fost acceptate.
Obiectivele comitetului ISO în curs de dezvoltare PDF 2.0 includ îmbunătățirea limbii PDF și amortizarea de caracteristici care nu mai sunt utilizate (de exemplu, numele Form XObject) și de standardizare a Adobe (de exemplu, Adobe JavaScript, rich text).
RTF
The Rich Text Format (RTF) este o format de fișier publicat caietul de sarcini si dezvoltat de Microsoft Corporation din 1987 pentru produsele Microsoft.
Cele mai multe procesoare de text sunt capabile să citească și să scrie unele versiuni ale RTF.Există mai multe revizii diferite in caietul de sarcini RTF și portabilitate fișierelor va depinde de ce versiune de RTF este folosita.Specificatiile RTF sunt schimbate și publicate cu versiuni majore Microsoft Word și Office.
RTF nu trebuie confundat cu textul îmbogățit (mimetype "text / îmbogățit" din RFC 1896) sau de predecesorul sau Rich Text (mimetype "text / Richtext" din RFC 1341 și 1521); nici cu RFT-DCA IBM (Revisable Format Text-Document Content Architecture), care sunt complet diferite specificații.
Richard Brodie, Charles Simonyi, și David Luebbert, membri ai echipei de dezvoltare Microsoft Word, au dezvoltat formatul RTF la finele anilor 1980. Sintaxa sa a fost influențată de limba redactarea TeX. Primul cititor de format RTF a fost dezvoltat în 1987, ca parte a Microsoft Word 3.0 pentru Macintosh, care a implementat versiunea RTF 1.0 in caietul de sarcini. Toate comunicatele ulterioare de Microsoft Word pentru Macintosh și toate versiunile de Windows pot citi și scrie fișiere în format RTF.
Microsoft detine drepturile asupra formatului RTF și menține formatul. În martie 2008 a aparut versiunea 1.9.1 care este ultima din serie. Potrivit documentatiei kit-ului de resurse Microsoft Office 2010, Microsoft nu mai produce îmbunătățiri caietului de sarcini RTF. În plus, unele caracteristici noi în Word 2010 și in versiunile ulterioare nu va salva de drept in format RTF.
Cronologia versiunilor:
-1987: RTF 1.0
-Ianuarie 1994: RTF 1.3
-Septembrie 1995: RTF 1.4
-Aprilie 1997: RTF 1,5
-Mai 1999: RTF 1,6
-August 2001: RTF 1,7
-Aprilie 2004: RTF 1,8
-Martie 2008: RTF 1.9.1
Versiuni RTF-imbunatatiri:
-RTF 1.4:caietul de sarcini conține toate comenzile RTF introduse de aplicații Microsoft, prin lansarea de Word 7.0.
-RTF 1.5:caietul de sarcini a fost actualizat pentru a include toate cuvintele de control noi introduse de Microsoft Word pentru Windows 95 versiunea 7.0 și Word 97 pentru Windows. Acesta conține, de asemenea, o specificație japoneza RTF locala pentru versiunea japoneză a Word, RTF numit-J, care este oarecum diferit de caietul de sarcini RTF standard.
-RTF 1.6:caietul de sarcini include toate cuvintele de control noi introduse de Microsoft Word pentru Windows 95 versiunea 7.0, Word 97 pentru Windows, Word 98 pentru Macintosh, și Word 2000 pentru Windows, precum și alte produse Microsoft – Pocket Word și Exchange (utilizate în RTF <> conversii HTML).
-RTF 1.7:caietul de sarcini include toate cuvintele de control noi introduse de Microsoft Word pentru Windows 95 versiunea 7.0, Word 97 pentru Windows, Word 98 pentru Macintosh, Word 2000 pentru Windows, și Word 2002 pentru Windows, precum și alte produse Microsoft – Pocket Word și Exchange (utilizat în RTF <> conversii HTML).
-RTF 1.8:caietul de sarcini conține cele mai recente actualizări aduse de Microsoft Office Word 2003
-RTF 1.9.1:caietul de sarcini conține cele mai recente actualizări aduse de Microsoft Office Word 2007, se definește, de asemenea, cuvinte de control introduse de alte produse Microsoft, cum ar fi Pocket Word și RichEdit, Exchange (utilizat în RTF <> conversii HTML), Microsoft Office Outlook (utilizat în RTF E-Mail).
Iată câteva dintre noile caracteristici:
-utilizarea personalizata XML și Etichete inteligente într-un document de RTF
-pentru utilizarea de XML, Office Open XML
-validare scheme XML particularizate de obicei XML
-posibilitatea de a defini XSL la salvarea într-un singur fișier XML (nu este definit prin caietul de sarcini)
-Office Open XML Math (OMML) elemente în RTF
-protecție cu parolă a RTF (WordprocessingML element de documentProtection în Office Open XML) read-only.
Microsoft Corporation anticipeaza nici alte actualizări RTF caietul de sarcini 1.9.1, dar este dispus să ia în considerare editorial și alte modificări non-materiale ale specificației RTF în timpul unei ISO asociat / IEC 29500 perioadă de numărare a voturilor; dar ea nu va face modificări care modificate funcții normative în acest RTF Specificatii.
Fiecare implementare RTF, de obicei, pune în aplicare doar unele versiuni sau subseturi din caietul de sarcini RTF. Multe dintre convertoare RTF disponibile nu pot înțelege toate caracteristicile noi din cele mai recente specificații RTF.
Editorul WordPad în Microsoft Windows creează fișiere RTF în mod implicit. Se selectează implicit la formatul de fișier Microsoft Word 6.0, dar scrie suport pentru documente Word (doc), pentru a mari securitatea. WordPad nu acceptă unele funcții RTF, cum ar fi anteturile și subsolurile.Cu toate acestea,in WordPad se poate citi și salva multe caracteristici RTF,dar nu se pot crea tabele, exponenti, indici , culori "extra", culorile de fundal de text, liste numerotate, liniuța dreapta sau la stânga, link-uri, și diverse linii distanțate.
Editorul de text implicit pentru Mac OS X, TextEdit, poate, de asemenea, vizualiza, edita și salva fișiere RTF precum și fișiere RTFD. TextEdit în prezent (din iulie 2009) are o capacitate limitată de a edita marjele de documente RTF. Programele de aplicații de procesare mult mai vechi, cum ar fi MacWrite și WriteNow,puteau de asemenea sa vizualizeze, editeze și sa salveze fișiere RTF.
Aplicatiile de procesoare open-source AbiWord, OpenOffice.org, KWord, și Bean posibilitatea de a vizualiza, edita și salva fișiere RTF. (Abiword și OpenOffice.org folosesc RTF 1.6, atunci când un nou fișier este salvat.) Format RTF este, de asemenea, utilizat în procesoare de text Ted pentru X Window System,ce pot rula pe sisteme de operare Unix sau Linux. Aceste implementări ar putea fi folositoare pentru cei care au nevoie să învețe cum să pună în aplicare formatul RTF în proiectul lor.
RTF poate fi folosit de cititorii de ebook, din cauza interoperabilității sale și cerințe reduse pentru procesare CPU, iar unele dispozitive, inclusiv BeBook, funcționează cel mai bine cu acest format.
Avantajele utilizarii formatului RTF:
-ofera compatibilitate universala software-ului procesoarelor de text si sistemelor de operare
-salvarea unui document in format RTF in favoarea unui format .doc ajuta la prevenirea virusilor,deoarece nu permite atasarea de macro-uri care,uneori,desfasoara virusi
Dezavantajele utilizarii formatului RTF:
-dezavantajul il prezinta salvarea unui fisier in format RTF deoarece dimensiunea este destul de mare,mai ales daca fisierul contine imagini incorporate.
IMPLEMENTAREA APLICATIEI
ARHITECURA APLICATIEI
Arhitectura software este definită de IEEE ca fiind: organizarea fundamentală a unui sistem, înglobată în componentele sistemului, în relațiile dintre acestea și în relațiile dintre componentele sistemului și mediul înconjurător, precum și principiile care guvernează proiectarea și evoluția sistemului. [ANSI/IEEE Std. 1471-2000, Recommended Practice for Architectural Description of Software-Intensive Systems].
Definiția propusă de IEEE spune faptul că arhitectura surprinde structura sistemului în ceea ce privește componentele acestuia precum și modul în care aceste componente interacționează. De asemenea arhitectura unui sistem definește și regulile după care sistemul este proiectat precum și cele care definesc modul în care el poate fi modificat.
Proiectarea arhitecturii software a aplicatiei Java PDF Export a fost realizata divizand programul in componente,module,obiecte sau orice alte unitati de pozitionare software.Impartirea aplicatiei in component a fost realizata in funtie de cerintele si constrangerile pe care aplicatia finala trebuia sa le indeplineasca.
Partitionarea aplicatiei a fost realizata in functie taskurile pe care o componentă trebuie să le îndeplinească în cadrul aplicației. Fiecare componentă joacă un anumit rol, dar și interacționează cu celelalte componente în vederea îndeplinirii funcționalității cerute.
Initial au fost definite taskurile proiectului:
1.Identificarea scopurilor si obiectivelor:
-Cercetarea bibliografica–presupune informarea generala asupra temei de cercetare. Principalele activitați implica documentarea asupra principalelor unelte software,precum si cautarea unor programe asemanatoare de convertire in PDF
-Cerintele proiectului – se vor intelege obiectivele și scopurile proiectului. Cerintele sunt structurate si organizate intr-un set de informatii complet, cuprinzator si coerent.
-Planul Proiectului –reflecta modul în care se preconizeaza realizarea efectiva a acestuia, de la faza de conceptie si pâna la terminare.
2.Proiectarea aplicatiei:
Se va realiza o aplicatie software in limbajul Java, care ne permite sa scriem text de la tastaura,iar mai apoi sa il generam in document PDF.Aplicatia va fi divizata in urmatoarele taskuri:
Se va construi un GUI (graphical user interface)
Se va stabili ordinea barelor de meniu
Se vor determina numarul de butoane ce trebuie implementate
Se va crea fereastra principala unde se scrie textul
Se va crea o functionalitate care ne va permite sa introducem text dintr-un fisier RTF
Se va crea o functionalitate care ne va permite sa salvam textul intr-un fisier RTF
Se va crea o functionalitate care ne va permite sa generam textul intr-un fisier PDF
3.Implementare
Se va scrie cod java pentru realizarea aplicatiei.
4.Testare
In aceasta faza se vor testa toate functionalitatile aplicatiei software
DESCRIEREA DETALIATA A APLICATIEI
Java PDF Export este o aplicatie windows,in limbajul Java, care ne permite sa scriem text de la tastaura,iar mai apoi sa il generam in document PDF.
Java PDF Export este un generator de PDF-uri,care,odata instalat ofera posibiliatea conversiei documentelor RTF in documente in format PDF.Crearea unui document PDF cu ajutorul aplicatiei Java PDF Export devine tot mai simpla comparativ cu alte programe care au fost construite in acelasi scop.Astfel ca,odata introdus textul in fereasta principala este nevoie de un singur click pentru a genera un PDF.Nu ramane decat sa alegem locatia unde dorim ca acesta sa fie salvat si tot procesul ajunge la final intr-un timp foarte scurt.
Am analizat aplicatiile existente pe piata care au acelasi scop cu Java PDF Export si am realizat ca aplicata mea se distinge prin urmatoarele caracteristici:
-simplitate si rapiditate: Utilizatorul adauga text in fereastra principala din fisier sau scris de la tastatura,apasa butonul „Export To PDF”,selecteaza locatia si ,cat sa un iti dai seama, documentul in format PDF a fost creat.
-editor de text: Utilizatorul poate scrie paragrafe,articole,etc de la tastatura ce pot fi tiparite dupa bunul plac cu privire la dimensiune,font sau culoare.
-suport pe 32/64 de biti: Poate fi folositatat pe sisteme de operate de 32 de biti cat si pe sisteme de operare de 64 de biti,
-fara programe aditionale: Nu necesita instalare unui alt program sumplimentar pentru generarea PDF-urilor.
-portabil: Poate fi transferat pe orice tip de memorie externa (memorii USB,carduri de memorie,etc) deoarece are o dimensiune mica in comparatie cu alte programe similare.
-utilizeaza putine resurse: Coparativ cu alte creatoare PDF,Java PDF Export consuma foarte putin din resursele calculatorului,iar performanta acestuia nu este afectata in timpul conversiei.
Java PDF Export este o aplicatie windows cu o interfata placuta.In general, generatoarele de PDF-uri trebuie sa se prezinte cu o interfata cat mai simpla,clara si concisa. Rapiditatea cu care poate genera un PDF trebuie sa fie punctul forte la aplicatiile de acest gen,deoarece,in calitate de utilizator,este un pas inapoi intrebuintarea unui program greoi ce consuma foarte mult timp.
Aceasta este interfata aplicatiei Java PDF Export:
Figura 1:Interfata
In continuare,vom analiza cea mai importanta functionalitate a creatorului Java PDF Export:
-in editorul de text putem redacta articole ce pot fi transformate intr-un fisier PDF.
Figura 2:Interfata
In editorul Java PDF Export a fost formulat in scris un articol despre tehnologia Java. Dupa ce a fost redactat,articolul poate fi transformat intr-un fisier PDF.
Pentru a transforma articolul intr-un fisier PDF este necesar,ca utilizatorul,sa aperse pe butonul „Export to PDF”.
In figura …. ne este prezentat un fisier PDF sub forma de captura de ecran.
Articolul Java generat in format PDF:
Figura 3:Interfata
Dupa cum putem observa,textul nu a suferit nicio modificare sau cuvinte lipsa. Adresarea in pagina este identica,alineatele se pastreaza,fontul si coloarea deasemenea. De aici reiese ca Java PDF Export functioneaza la cele mai inalte cote.
Descrierea claselor
Clasa principală se numește JEditor.Aici se adaugă fereastra,butoanele,se seteaza dimensiunile,devine vizibilă,etc.
public class JEditor extends JFrame implements ActionListener {
IMediator med = new Mediator();
JEditor() {
super("Java Editor PDF");
JToolBar p = new JToolBar();
p.add(new BtnOpen(this, med));
p.add(new BtnSave(this, med));
p.add(new BtnFont(this, med));
p.add(new BtnColorChooser(this, med));
p.add(new BtnInsertImage(this, med));
p.add(new BtnExportToPdf(this, med));
getContentPane().add(new JScrollPane(new LblDisplay(med)), "Center");
getContentPane().add(p, "North");
setSize(800, 600);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
public void actionPerformed(ActionEvent ae) {
ICommand comd = (ICommand) ae.getSource();
comd.execute();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(new SubstanceDustCoffeeLookAndFeel());
// UIManager.setLookAndFeel(new SubstanceGraphiteLookAndFeel());
} catch (UnsupportedLookAndFeelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new JEditor();
}
});
}
Clasele pentru butoane.
Vom analiza 6 clase pentru butoane:
-BtnColorChooser
-BtnExportToPDF
-BtnFont
-BtnInsertImage
-BtnOpen
-BtnSave
Fiecare clasa este formata dintr-un constructor si un ActionListener.
BtnColorChooser:
class BtnColorChooser extends JButton implements ICommand {
IMediator med;
BtnColorChooser(ActionListener al, IMediator m) {
super("Color Chooser");
addActionListener(al);
med = m;
med.registerColorChooser(this);
}
public void execute() {
med.colorChooser();
}
}
BtnExportToPDF:
class BtnExportToPdf extends JButton implements ICommand {
IMediator med;
BtnExportToPdf(ActionListener al, IMediator m) {
super("Export To PDF");
addActionListener(al);
med = m;
med.registerExportToPdf(this);
}
public void execute() {
med.exportToPdf();
}
}
BtnFont:
public class BtnFont extends JButton implements ICommand {
IMediator med;
BtnFont(ActionListener al, IMediator m) {
super("Font Chooser");
addActionListener(al);
med = m;
med.registerFontChooser(this);
}
public void execute() {
med.chooseFont();
}
}
BtnInsertImage:
class BtnInsertImage extends JButton implements ICommand {
IMediator med;
BtnInsertImage(ActionListener al, IMediator m) {
super("Insert Image");
addActionListener(al);
med = m;
med.registerInsertImage(this);
}
public void execute() {
med.insertImage();
}
}
BtnOpen:
public class BtnOpen extends JButton implements ICommand {
IMediator med;
BtnOpen(ActionListener al, IMediator m) {
super("Open File");
addActionListener(al);
med = m;
med.registerOpen(this);
}
public void execute() {
med.open();
}
}
BtnSave:
class BtnSave extends JButton implements ICommand {
IMediator med;
BtnSave(ActionListener al, IMediator m) {
super("Save");
addActionListener(al);
med = m;
med.registerColorChooser(this);
}
public void execute() {
med.save();
}
}
Clasa IMediator
Aici se realizează interfața:
interface IMediator {
public void open();
public void chooseFont();
public void save();
public void registerFontChooser(BtnFont v);
public void registerColorChooser(BtnSave s);
public void registerOpen(BtnOpen b);
public void registerDisplay(LblDisplay d);
public void registerColorChooser(BtnColorChooser btnColorChooser);
public void colorChooser();
public void exportToPdf();
public void registerExportToPdf(BtnExportToPdf btnExportToPdf);
public void insertImage();
public void registerInsertImage(BtnInsertImage btnInsertImage);
}
Ce este o interfață?
O interfață în limbajul de programare Java este un tip abstract, care este folosit pentru a specifica o interfață (în sensul generic al termenului), care trebuie să implementeze clase. Interfețele sunt declarate folosind cuvântul cheie de interfață și pot conține numai metoda de semnătură și declarațiile constante (declarații de variabile care sunt declarate pentru a fi atât static și finală).
Definiție:O interfață este o colecție de metode fară implementare și declarații de constante
Interfeța nu poate fi instanțiată, ci mai degrabă este pusa în aplicare. O clasă care implementează o interfață trebuie să implementeze toate metodele descrise în interfața, sau să fie o clasă abstractă.
Un beneficiu in folosirea interfețelor este că ele simulează moștenire multiplă. Toate clasele în Java trebuie să aibă exact o clasa de baza, singura excepție fiind java.lang.Object (clasa rădăcină a sistemului de tip Java); mostenirea multipla de clase nu este permis.
Interfețele sunt folosite pentru a codifica asemănări care clasele de diferite tipuri de acțiuni, dar nu constituie neapărat o relație de clasă.
O altă utilizare a interfețelor este posibilitatea de a folosi un obiect, fără să se știe tipul de clasă, ci doar că ea pune în aplicare o anumită interfață.
Clasa Mediator
-este clasa unde sunt implementate toate funcționalitățile
În continuare vom analiza cateva funcționalități pentru buntoane:
-pentru butonul Open:
public void open() {
btnOpen.setEnabled(true);
btnFont.setEnabled(true);
btnSave.setEnabled(true);
fc=new JFileChooser();
fc.setCurrentDirectory(new File("."));
fc.setFileFilter(filter_RTF);
if(fc.showOpenDialog(null)==0)
{
try
{System.out.println("fc.getSelectedFile() "+fc.getSelectedFile());
fInput=new FileInputStream(fc.getSelectedFile());
rtfKit.read(fInput,jTextPane.getDocument(),0);
docx.read(fInput,jTextPane.getDocument(), 0);
// SetEnable_JTextPane();
doc=jTextPane.getStyledDocument();
//doc =docx
//Opened_File=fc.getSelectedFile();
//String title=fc.getSelectedFile().toString();
//RTFEditor.this.setTitle(title);
fInput.close();
}
catch(FileNotFoundException ex)
{
JOptionPane.showMessageDialog(null,"Can't find file");
}
catch(IOException ex)
{
JOptionPane.showMessageDialog(null,"Error reading file");
}
catch(BadLocationException ex)
{}
}
}
-pentru butonul ChooseFont:
public void chooseFont() {
// btnFont.setEnabled(false);
btnSave.setEnabled(true);
btnOpen.setEnabled(true);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
FontWindow fw = new FontWindow(null,font);
font = fw.getFont();
font = YaniaFont.getInstance().getFont();
if (font != null) {
insertToTextPane(jTextPane, font, color,null);
System.out.println("font "+font );
} //show.setEditorKit(edk);
}
});
}
-pentru butonul Save:
public void save() {
JFileChooser fileChooser = new JFileChooser();
//System.out.println("fileChooser.showSaveDialog(null) "+fileChooser.showSaveDialog(null));
if(JFileChooser.APPROVE_OPTION == fileChooser.showSaveDialog(null)){
File ff = fileChooser.getSelectedFile();
System.out.println("test");
try {
System.out.println("ddd "+doc);
if (doc != null) {
//rf.write(new FileOutputStream(ff.getAbsolutePath()+".rtf"), doc, 0, doc.getLength());
FileOutputStream out = new FileOutputStream(ff.getAbsolutePath()+".docx");
//rtfKit.write(out,jTextPane.getDocument(), 0, jTextPane.getDocument().getLength());
docx.write(out,jTextPane.getDocument(), 0, jTextPane.getDocument().getLength());
out.close();
}
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println(e.getMessage());
} catch (BadLocationException e) {
System.out.println(e.getMessage());
}
};
}
-pentru butonul ExportToPDF:
public void exportToPdf() {
try {
UIManager.setLookAndFeel(new SubstanceModerateLookAndFeel());
} catch (UnsupportedLookAndFeelException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
JFileChooser fileChooser = new JFileChooser();
//System.out.println("fileChooser.showSaveDialog(null) "+fileChooser.showSaveDialog(null));
if(JFileChooser.APPROVE_OPTION == fileChooser.showSaveDialog(null)){
File ff = fileChooser.getSelectedFile();
System.out.println(ff.getAbsolutePath()+".pdf");
//print(ff.getAbsolutePath()+".pdf");
try {
exportToPDF(ff.getAbsolutePath()+".pdf", jTextPane, true);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
System.out.println("nimik");
try {
UIManager.setLookAndFeel(new SubstanceDustCoffeeLookAndFeel());
} catch (UnsupportedLookAndFeelException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
-pentru butonul InsertImage:
public void insertImage() {
JFileChooser fc = new JFileChooser();
int result = fc.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
//img = new ImageIcon(ImageIO.read(file));
insertImage(file.getAbsolutePath());
// insertToTextPane(jTextPane, font, color, img);
}
}
Clasa ColorMenu
public class ColorMenu extends JMenu
{
protected Border m_unselectedBorder;
protected Border m_selectedBorder;
protected Border m_activeBorder;
protected Hashtable m_panes;
protected ColorPane m_selected;
public ColorMenu(String name) {
super(name);
m_unselectedBorder = new CompoundBorder(
new MatteBorder(1, 1, 1, 1, getBackground()),
new BevelBorder(BevelBorder.LOWERED,
Color.white, Color.gray));
m_selectedBorder = new CompoundBorder(
new MatteBorder(2, 2, 2, 2, Color.red),
new MatteBorder(1, 1, 1, 1, getBackground()));
m_activeBorder = new CompoundBorder(
new MatteBorder(2, 2, 2, 2, Color.blue),
new MatteBorder(1, 1, 1, 1, getBackground()));
JPanel p = new JPanel();
p.setBorder(new EmptyBorder(5, 5, 5, 5));
p.setLayout(new GridLayout(8, 8));
m_panes = new Hashtable();
int[] values = new int[] { 0, 128, 192, 255 };
for (int r=0; r<values.length; r++) {
for (int g=0; g<values.length; g++) {
for (int b=0; b<values.length; b++) {
Color c = new Color(values[r], values[g], values[b]);
ColorPane pn = new ColorPane(c);
p.add(pn);
m_panes.put(c, pn);
}
}
}
add(p);
}
public void setColor(Color c) {
Object obj = m_panes.get(c);
if (obj == null)
return;
if (m_selected != null)
m_selected.setSelected(false);
m_selected = (ColorPane)obj;
m_selected.setSelected(true);
}
public Color getColor() {
if (m_selected == null)
return null;
return m_selected.getColor();
}
public void doSelection() {
fireActionPerformed(new ActionEvent(this,
ActionEvent.ACTION_PERFORMED, getActionCommand()));
}
class ColorPane extends JPanel implements MouseListener
{
protected Color m_c;
protected boolean m_selected;
public ColorPane(Color c) {
m_c = c;
setBackground(c);
setBorder(m_unselectedBorder);
String msg = "R "+c.getRed()+", G "+c.getGreen()+
", B "+c.getBlue();
setToolTipText(msg);
addMouseListener(this);
}
public Color getColor() { return m_c; }
public Dimension getPreferredSize() {
return new Dimension(15, 15);
}
public Dimension getMaximumSize() { return getPreferredSize(); }
public Dimension getMinimumSize() { return getPreferredSize(); }
public void setSelected(boolean selected) {
m_selected = selected;
if (m_selected)
setBorder(m_selectedBorder);
else
setBorder(m_unselectedBorder);
}
public boolean isSelected() { return m_selected; }
public void mousePressed(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {
setColor(m_c);
MenuSelectionManager.defaultManager().clearSelectedPath();
doSelection();
}
public void mouseEntered(MouseEvent e) {
setBorder(m_activeBorder);
}
public void mouseExited(MouseEvent e) {
setBorder(m_selected ? m_selectedBorder :
m_unselectedBorder);
}
}
}.
Clasa FontWindow
public class FontWindow extends JDialog {
private Font font = null;
public FontWindow(JFrame frame,Font font) throws HeadlessException {
super(frame,true);
if (font == null) {
font = new Font("Tahoma", Font.BOLD, 22);
}
getContentPane().add(new YFontChooser(font),BorderLayout.NORTH);
getContentPane().add(makeBottomPannel(),BorderLayout.CENTER);
setSize(500,300);
setResizable(false);
setVisible(true);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}
public JPanel makeBottomPannel(){
JPanel jp = new JPanel();
JButton okButton = new JButton("Apply");
JLabel okButtons = new JLabel(" ");
JButton cancelButton = new JButton("Cancel");
okButtons.setEnabled(false);
jp.add(okButton);
jp.add(okButtons);
jp.add(cancelButton);
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
font = YaniaFont.getInstance().getFont();
disposeWindow();
}
});
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
font = null;
disposeWindow();
}
});
return jp;
}
protected void disposeWindow() {
this.dispose();
}
public Font getSelectedFont(){
return font;
}
public static void main(String[] args) {
Font font = new Font("Tahoma", Font.BOLD, 22);
//new FontWindow(font);
}
}
Manual de utilizare
In continuare,vom analiza functionalitatile creatorului Java PDF Export:
-in editorul de text putem redacta articole ce pot fi transformate intr-un fisier PDF.
Figura 2:Interfata
In editorul Java PDF Export a fost formulat in scris un articol despre tehnologia Java. Dupa ce a fost redactat,articolul poate fi transformat intr-un fisier PDF sau salvat in format RTF.
In continuare,ne este prezentat un fisier PDF sub forma de captura de ecran,dupa ce a fost apasat butonul „Export To PDF”.
Articolul Java generat ca PDF:
Figura 3:Interfata
-o alta functionalitate a aplicatiei este incarcarea unui articol dintr-un document RTF in Java PDF Export Figura 3.5
Pentru a realiza acest lucru vom apasa butonul “Open File” iar programul ne va deschide o fereastra noua.Apoi, urmeaza sa deschidem un document de tip RTF din memorie pentru a putea fi incarcat in program.
Figura 5
In figurile 5 si 6 ne este prezentata incarcarea unui paragraf dintr-un fisier RTF in aplicatia Java PDF Export.
-daca utilizatorul redacteaza un articol in Java PDF Export si nu doreste sa genereze un document PDF,atunci are varianta de a salva articolul intr-un document .doc actionand butonul „Save”.
Atunci cand apasam butonul “Save” programul ne va deschide o fereastra noua ce ne va permite sa ne alegem locatia unde vom salva articolul.
Figura
Figura 8
In figurile 7 si 8 ne este prezentat procesul de salvare a unui articol redactat in editorul Java intr-un fisier .doc.
-in urmatoarea captura de ecran ne este prezentat cum putem alege fontul cu care sa redactam un paragraf.
Prin actionarea butonului „Font Chooser” aplicatia va deschide o fereastra in care putem observa o paleta vasta de categorii de fonturi.Ne sunt expuse peste doua sute de modele de fonturi pe care le putem utiliza in scrierea textului nostru.Se mai pun la dispozitie 4 tipuri de inclinatii si 17 tipuri de marimi ale fonturilor.
Figura 9
Pentru un editor de text cu rolul de a genera PDF-uri este mai mult decat necesara aceasta gama de fonturi si marimi care ne este pusa la dispozitie de Java PDF Export.
-in urmatoarele cinci capturi de ecran ne este prezentat cum putem alege culoarea cu care va fi scris fontul cu care putem redacta un paragraf.
Prin actionarea butonului „Color Chooser” aplicatia va deschide o fereastra in care putem observa o paleta vasta de culori.Ne sunt expuse milioane de nuante de culori pe care le putem utiliza in scrierea textului nostru.
Modul în care putem selecta culoarea dorita este diversificat.Putem utiliza absolut orice culoare dorim.
Pot fi create culori sau pot fi selectate din lista de culori.Acest lucru îl putem observa in figurile ……………. .
Figura 34
Figura 23
Figura44Figura 333
-in editorul Java PDF Export se pot adauga imagini.Acest lucru se poate realiza prin apasarea butonului „Insert Image”.
Imaginile sunt foarte importante intr-un articol.Ele pot fi semnificative atunci cand este creat un proiect de orice natura.
Concluzii
Alegerea acestui proiect ma ajutat să-mi dezvolt cunoștințele în domeniul programării în limbajul Java și tehnologiile open-source.
Aplicația este utilă utilizatorilor ce lucreaza cu documente.
Aplicația ar putea fi îmbunătățită adăugând mai multe funcționalități cum ar fi:
– posibilitatea de a insera text din mai mule tipuri de fișiere (.doc, .docx, .xls, .xlsx, .txt, .html, etc)
– editorului i se pot adauga imbunatațiri(creare de tabele,grafice,formule matematice,etc)
Bibliografie
[DAR01] – Ian F. Darwin, Java Cookbook, O’Reilly Media, 2001
[PER04] – Bruce W. Perry, Java Servlet & JSP Cookbook, , O’Reilly Media, 2004
Referințe web
aaaa
Jar:
http://www.scritub.com/stiinta/informatica/java/Arhive-JAR-Java-ARchive51767.php
JAVA:
Codul sursă
Clase SRC:
Clasa BtnColorChooser
import java.awt.event.ActionListener;
import javax.swing.JButton;
class BtnColorChooser extends JButton implements ICommand {
IMediator med;
BtnColorChooser(ActionListener al, IMediator m) {
super("Color Chooser");
addActionListener(al);
med = m;
med.registerColorChooser(this);
}
public void execute() {
med.colorChooser();
}
}
Clasa BtnExportToPDF
import java.awt.event.ActionListener;
import javax.swing.JButton;
class BtnExportToPdf extends JButton implements ICommand {
IMediator med;
BtnExportToPdf(ActionListener al, IMediator m) {
super("Export To PDF");
addActionListener(al);
med = m;
med.registerExportToPdf(this);
}
public void execute() {
med.exportToPdf();
}
}
Clasa BtnFont
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class BtnFont extends JButton implements ICommand {
IMediator med;
BtnFont(ActionListener al, IMediator m) {
super("Font Chooser");
addActionListener(al);
med = m;
med.registerFontChooser(this);
}
public void execute() {
med.chooseFont();
}
}
Clasa BtnInsertImage
import java.awt.event.ActionListener;
import javax.swing.JButton;
class BtnInsertImage extends JButton implements ICommand {
IMediator med;
BtnInsertImage(ActionListener al, IMediator m) {
super("Insert Image");
addActionListener(al);
med = m;
med.registerInsertImage(this);
}
public void execute() {
med.insertImage();
}
}
Clasa BtnOpen
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class BtnOpen extends JButton implements ICommand {
IMediator med;
BtnOpen(ActionListener al, IMediator m) {
super("Open File");
addActionListener(al);
med = m;
med.registerOpen(this);
}
public void execute() {
med.open();
}
}
Clasa BtnSave
import java.awt.event.ActionListener;
import javax.swing.JButton;
class BtnSave extends JButton implements ICommand {
IMediator med;
BtnSave(ActionListener al, IMediator m) {
super("Save");
addActionListener(al);
med = m;
med.registerColorChooser(this);
}
public void execute() {
med.save();
}
}
Clasa ICommand
interface ICommand {
public abstract void execute();
}
Clasa IMediator
interface IMediator {
public void open();
public void chooseFont();
public void save();
public void registerFontChooser(BtnFont v);
public void registerColorChooser(BtnSave s);
public void registerOpen(BtnOpen b);
public void registerDisplay(LblDisplay d);
public void registerColorChooser(BtnColorChooser btnColorChooser);
public void colorChooser();
public void exportToPdf();
public void registerExportToPdf(BtnExportToPdf btnExportToPdf);
public void insertImage();
public void registerInsertImage(BtnInsertImage btnInsertImage);
}
Clasa JEditor
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import org.pushingpixels.substance.api.skin.SubstanceAutumnLookAndFeel;
import org.pushingpixels.substance.api.skin.SubstanceBusinessLookAndFeel;
import org.pushingpixels.substance.api.skin.SubstanceChallengerDeepLookAndFeel;
import org.pushingpixels.substance.api.skin.SubstanceCremeLookAndFeel;
import org.pushingpixels.substance.api.skin.SubstanceDustCoffeeLookAndFeel;
import org.pushingpixels.substance.api.skin.SubstanceDustLookAndFeel;
import org.pushingpixels.substance.api.skin.SubstanceGraphiteLookAndFeel;
public class JEditor extends JFrame implements ActionListener {
IMediator med = new Mediator();
JEditor() {
super("Java Editor PDF");
JToolBar p = new JToolBar();
p.add(new BtnOpen(this, med));
p.add(new BtnSave(this, med));
p.add(new BtnFont(this, med));
p.add(new BtnColorChooser(this, med));
p.add(new BtnInsertImage(this, med));
p.add(new BtnExportToPdf(this, med));
getContentPane().add(new JScrollPane(new LblDisplay(med)), "Center");
getContentPane().add(p, "North");
setSize(800, 600);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
public void actionPerformed(ActionEvent ae) {
ICommand comd = (ICommand) ae.getSource();
comd.execute();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(new SubstanceDustCoffeeLookAndFeel());
// UIManager.setLookAndFeel(new SubstanceGraphiteLookAndFeel());
} catch (UnsupportedLookAndFeelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new JEditor();
}
});
}
}
Clasa LblDisplay
import java.awt.Font;
import javax.swing.JLabel;
import javax.swing.JTextPane;
public class LblDisplay extends JTextPane {
IMediator med;
LblDisplay(IMediator m) {
super();
med = m;
med.registerDisplay(this);
setEditable(true);
setFont(new Font("Arial", Font.BOLD, 24));
}
@Override
public void setFont(Font arg0) {
super.setFont(arg0);
}
}
Clasa Mediator
import java.awt.Color;
import java.awt.Component;
import java.awt.Desktop;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.AbstractButton;
import javax.swing.ImageIcon;
import javax.swing.JColorChooser;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.plaf.FileChooserUI;
import javax.swing.text.BadLocationException;
import javax.swing.text.EditorKit;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import javax.swing.text.StyledEditorKit;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.rtf.RTFEditorKit;
import org.pushingpixels.substance.api.skin.SubstanceCremeLookAndFeel;
import org.pushingpixels.substance.api.skin.SubstanceDustCoffeeLookAndFeel;
import org.pushingpixels.substance.api.skin.SubstanceModerateLookAndFeel;
import sl.docx.DocxEditorKit;
import com.itextpdf.awt.DefaultFontMapper;
import com.itextpdf.awt.PdfGraphics2D;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;
import font.FontWindow;
import font.application.ChooseFontWindow;
import font.controller.YaniaFont;
class Mediator implements IMediator {
BtnFont btnFont;
BtnSave btnSave;
BtnOpen btnOpen;
BtnColorChooser btnColor;
BtnExportToPdf btnExport;
BtnInsertImage btnInsert;
JFileChooser fc;
final SimpleFilter filter_RTF=new SimpleFilter("rtf","RTF Document"); // FILTER ONLY FOR RTF DOCUMENTS (FILES)
DocxEditorKit docx = new DocxEditorKit();
RTFEditorKit rtfKit=new RTFEditorKit();
JTextPane jTextPane;
Font font ;
Color color = Color.black;
FileInputStream fInput;
StyledDocument doc;
private Image image;
private ImageIcon img;
public void registerFontChooser(BtnFont v) {
btnFont = v;
}
public void registerColorChooser(BtnSave s) {
btnSave = s;
}
public void registerOpen(BtnOpen b) {
btnOpen = b;
}
public void registerDisplay(LblDisplay d) {
jTextPane = d;
jTextPane.setEditorKit(rtfKit);
//jTextPane.setStyledDocument(d);
}
public void open() {
btnOpen.setEnabled(true);
btnFont.setEnabled(true);
btnSave.setEnabled(true);
fc=new JFileChooser();
fc.setCurrentDirectory(new File("."));
fc.setFileFilter(filter_RTF);
if(fc.showOpenDialog(null)==0)
{
try
{System.out.println("fc.getSelectedFile() "+fc.getSelectedFile());
fInput=new FileInputStream(fc.getSelectedFile());
rtfKit.read(fInput,jTextPane.getDocument(),0);
docx.read(fInput,jTextPane.getDocument(), 0);
// SetEnable_JTextPane();
doc=jTextPane.getStyledDocument();
//doc =docx
//Opened_File=fc.getSelectedFile();
//String title=fc.getSelectedFile().toString();
//RTFEditor.this.setTitle(title);
fInput.close();
}
catch(FileNotFoundException ex)
{
JOptionPane.showMessageDialog(null,"Can't find file");
}
catch(IOException ex)
{
JOptionPane.showMessageDialog(null,"Error reading file");
}
catch(BadLocationException ex)
{}
}
}
public void chooseFont() {
// btnFont.setEnabled(false);
btnSave.setEnabled(true);
btnOpen.setEnabled(true);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
FontWindow fw = new FontWindow(null,font);
font = fw.getFont();
font = YaniaFont.getInstance().getFont();
if (font != null) {
insertToTextPane(jTextPane, font, color,null);
System.out.println("font "+font );
} //show.setEditorKit(edk);
}
});
}
public void save() {
JFileChooser fileChooser = new JFileChooser();
//System.out.println("fileChooser.showSaveDialog(null) "+fileChooser.showSaveDialog(null));
if(JFileChooser.APPROVE_OPTION == fileChooser.showSaveDialog(null)){
File ff = fileChooser.getSelectedFile();
System.out.println("test");
try {
System.out.println("ddd "+doc);
if (doc != null) {
//rf.write(new FileOutputStream(ff.getAbsolutePath()+".rtf"), doc, 0, doc.getLength());
FileOutputStream out = new FileOutputStream(ff.getAbsolutePath()+".docx");
//rtfKit.write(out,jTextPane.getDocument(), 0, jTextPane.getDocument().getLength());
docx.write(out,jTextPane.getDocument(), 0, jTextPane.getDocument().getLength());
out.close();
}
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println(e.getMessage());
} catch (BadLocationException e) {
System.out.println(e.getMessage());
}
};
}
@Override
public void registerColorChooser(BtnColorChooser btnColorChooser) {
btnColor = btnColorChooser;
}
@Override
public void colorChooser() {
Color newColor = JColorChooser.showDialog(null, "Dialog Title", color);
insertToTextPane(jTextPane, font, newColor,null);
}
@Override
public void exportToPdf() {
try {
UIManager.setLookAndFeel(new SubstanceModerateLookAndFeel());
} catch (UnsupportedLookAndFeelException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
JFileChooser fileChooser = new JFileChooser();
//System.out.println("fileChooser.showSaveDialog(null) "+fileChooser.showSaveDialog(null));
if(JFileChooser.APPROVE_OPTION == fileChooser.showSaveDialog(null)){
File ff = fileChooser.getSelectedFile();
System.out.println(ff.getAbsolutePath()+".pdf");
//print(ff.getAbsolutePath()+".pdf");
try {
exportToPDF(ff.getAbsolutePath()+".pdf", jTextPane, true);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
System.out.println("nimik");
try {
UIManager.setLookAndFeel(new SubstanceDustCoffeeLookAndFeel());
} catch (UnsupportedLookAndFeelException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
@Override
public void registerExportToPdf(BtnExportToPdf btnExportToPdf) {
btnExport = btnExportToPdf;
}
@Override
public void insertImage() {
JFileChooser fc = new JFileChooser();
int result = fc.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
//img = new ImageIcon(ImageIO.read(file));
insertImage(file.getAbsolutePath());
// insertToTextPane(jTextPane, font, color, img);
}
}
@Override
public void registerInsertImage(BtnInsertImage btnInsertImage) {
btnInsert = btnInsertImage;
}
public void insertToTextPane(JTextPane jtp, Font font, Color c, ImageIcon imageIcon) {
// Start with the current input attributes for the JTextPane. This
// should ensure that we do not wipe out any existing attributes
// (such as alignment or other paragraph attributes) currently
// set on the text area.
MutableAttributeSet attrs = jtp.getInputAttributes();
// Set the font family, size, and style, based on properties of
// the Font object. Note that JTextPane supports a number of
// character attributes beyond those supported by the Font class.
// For example, underline, strike-through, super- and sub-script.
if (font != null) {
StyleConstants.setFontFamily(attrs, font.getFamily());
StyleConstants.setFontSize(attrs, font.getSize());
StyleConstants.setItalic(attrs, (font.getStyle() & Font.ITALIC) != 0);
StyleConstants.setBold(attrs, (font.getStyle() & Font.BOLD) != 0);
}
// Set the font color
StyleConstants.setForeground(attrs, c);
if (imageIcon != null)
StyleConstants.setIcon(attrs, imageIcon);
// Retrieve the pane's document object
doc = jtp.getStyledDocument();
// Replace the style for the entire document. We exceed the length
// of the document by 1 so that text entered at the end of the
// document uses the attributes.
doc.setCharacterAttributes(doc.getLength()+1, doc.getLength() + 1, attrs, false);
}
public void createPdf(String filename) throws IOException, DocumentException, BadLocationException {
// step 1
Document document = new Document(new Rectangle(jTextPane.getWidth(), jTextPane.getHeight()));
// step 2
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
// step 3
document.open();
// step 4
PdfContentByte canvas = writer.getDirectContent();
// create a default font mapper
DefaultFontMapper mapper = new DefaultFontMapper();
// and map MS Gothic to the corresponding font program
// BaseFontParameters parameters = new BaseFontParameters("c:/windows/fonts/msgothic.ttc,1");
// parameters.encoding = BaseFont.IDENTITY_H;
//mapper.putName("MS PGothic", parameters );
Graphics2D g2 = new PdfGraphics2D(canvas, jTextPane.getWidth(), jTextPane.getHeight(), mapper);
// create the text pane and print it.
jTextPane.print(g2);
g2.dispose();
// step 5
document.close();
}
private void saveWithHtml(){
if (jTextPane.getText().length() > 0){
JFileChooser chooser = new JFileChooser();
chooser.setMultiSelectionEnabled(false);
int option = chooser.showSaveDialog(null);
if (option == JFileChooser.APPROVE_OPTION) {
StyledDocument doc = (StyledDocument)jTextPane.getDocument();
HTMLEditorKit kit = new HTMLEditorKit();
BufferedOutputStream out;
try {
out = new BufferedOutputStream(new FileOutputStream(chooser.getSelectedFile().getAbsoluteFile()));
kit.write(out, doc, doc.getStartPosition().getOffset(), doc.getLength());
} catch (FileNotFoundException e) {
} catch (IOException e){
} catch (BadLocationException e){
}
}
}
}
private void print(String pdfFileName) {
System.out.println("Printing PDF file ..");
try {
File pdf = new File(pdfFileName);
Document document = new Document(PageSize.A4);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdf));
document.open();
PdfContentByte cb = writer.getDirectContent();
Graphics2D g2d = cb.createGraphics(PageSize.A4.getWidth(), PageSize.A4.getHeight());
//System.out.println(txtArea.getSize());
jTextPane.printAll(g2d);
g2d.dispose();
document.close();
writer.flush();
writer.close();
} catch (DocumentException de) {
System.err.println(de.getMessage());
} catch (IOException ioe) {
System.err.println(ioe.getMessage());
}
}
public static void exportToPDF(String outputFile, Component component,
boolean writeShapes) throws Exception {
int width = component.getWidth();
int height = component.getHeight();
Document document = new Document(new Rectangle(width,
height));
PdfWriter writer;
writer = PdfWriter.getInstance(document, new FileOutputStream(
outputFile));
document.open();
PdfContentByte cb = writer.getDirectContent();
Graphics2D g = writeShapes ? cb.createGraphicsShapes(width, height)
: cb.createGraphics(width, height);
component.print(g);
g.dispose();
document.close();
}
private void insertImage(String imagePath){
MutableAttributeSet attrs = jTextPane.getInputAttributes();
System.out.println("insertImage "+imagePath);
StyleConstants.setIcon(attrs, new ImageIcon(imagePath));
try {
doc.insertString(doc.getLength(), "test", attrs);
} catch (BadLocationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Clasa SimpleFilter
import javax.swing.filechooser.FileFilter;
import java.io.*;
public class SimpleFilter extends FileFilter
{
private String m_description = null;
private String m_extension = null;
public SimpleFilter(String extension, String description) {
m_description = description;
m_extension = "." + extension.toLowerCase();
}
public String getDescription() {
return m_description;
}
public boolean accept(File f) {
if (f == null)
return false;
if (f.isDirectory())
return true;
return f.getName().toLowerCase().endsWith(m_extension);
}
}
Clase Editor:
Clasa AddingTables
package editor;
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.text.*;
public class AddingTables {
JTextPane textPane;
public AddingTables() {
String[] text = {
"This component models paragraphs that are composed of " +
"runs of character level attributes.\n", // 0 – 89
" \n", // 90 – 91
"Each paragraph may have a logical style attached to it which " +
"contains the default attributes to use if not overridden by " +
"attributes set on the paragraph or character run. Components " +
"and images may be embedded in the flow of text." // 92 – 321
};
textPane = new JTextPane();
StyledDocument doc = textPane.getStyledDocument();
createStyles(doc);
setContent(doc, text);
styleContent(doc);
}
private void createStyles(StyledDocument doc) {
Style baseStyle = doc.addStyle("base", null);
StyleConstants.setFontFamily(baseStyle, "Lucida Sans Unicode");
StyleConstants.setFontSize(baseStyle, 18);
StyleConstants.setFirstLineIndent(baseStyle, 20f);
StyleConstants.setLeftIndent(baseStyle, 10f);
Style style = doc.addStyle("bold", baseStyle);
StyleConstants.setBold(style, true);
style = doc.addStyle("italic", baseStyle);
StyleConstants.setItalic(style, true);
style = doc.addStyle("blue", baseStyle);
StyleConstants.setForeground(style, Color.blue);
style = doc.addStyle("underline", baseStyle);
StyleConstants.setUnderline(style, true);
style = doc.addStyle("green", baseStyle);
StyleConstants.setForeground(style, Color.green.darker());
StyleConstants.setUnderline(style, true);
style = doc.addStyle("highlight", baseStyle);
StyleConstants.setForeground(style, Color.yellow);
StyleConstants.setBackground(style, Color.black);
style = doc.addStyle("table", null);
StyleConstants.setComponent(style, getTableComponent());
style = doc.addStyle("tableParagraph", null);
StyleConstants.setLeftIndent(style, 35f);
StyleConstants.setRightIndent(style, 35f);
StyleConstants.setSpaceAbove(style, 15f);
StyleConstants.setSpaceBelow(style, 15f);
}
private void setContent(StyledDocument doc, String[] text) {
try {
doc.insertString(0, text[0], doc.getStyle("base"));
doc.insertString(doc.getLength(), text[1], doc.getStyle("table"));
doc.insertString(doc.getLength(), text[2], doc.getStyle("base"));
} catch(BadLocationException e) {
System.out.printf("Bad location error: %s%n", e.getMessage());
}
}
private void styleContent(StyledDocument doc) {
Style style = doc.getStyle("base");
doc.setLogicalStyle(0, style);
style = doc.getStyle("underline");
doc.setCharacterAttributes(22, 10, style, false);
style = doc.getStyle("highlight");
doc.setCharacterAttributes(62, 26, style, false);
Style logicalStyle = doc.getLogicalStyle(0);
style = doc.getStyle("tableParagraph");
doc.setParagraphAttributes(90, 1, style, false);
style = doc.getStyle("table");
doc.setCharacterAttributes(90, 1, style, false);
doc.setLogicalStyle(92, logicalStyle);
style = doc.getStyle("blue");
doc.setCharacterAttributes(118, 13, style, false);
style = doc.getStyle("italic");
doc.setCharacterAttributes(166, 18, style, false);
style = doc.getStyle("green");
doc.setCharacterAttributes(235, 9, style, false);
doc.setCharacterAttributes(248, 9, style, false);
style = doc.getStyle("bold");
doc.setCharacterAttributes(263, 10, style, false);
doc.setCharacterAttributes(278, 6, style, false);
}
private JScrollPane getTableComponent() {
JTable table = new JTable(getModel());
Dimension d = table.getPreferredSize();
d.width = 300;
table.setPreferredScrollableViewportSize(d);
return new JScrollPane(table);
}
private AbstractTableModel getModel() {
return new AbstractTableModel() {
public int getColumnCount() { return 3; }
public int getRowCount() { return 3; }
public Object getValueAt(int row, int col) {
return String.valueOf(row + 1) + (col + 1);
}
};
}
private JScrollPane getContent() {
return new JScrollPane(textPane);
}
public static void main(String[] args) {
System.setProperty("swing.aatext", "true");
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setContentPane(new AddingTables().getContent());
f.setSize(500,400);
f.setLocation(200,200);
f.setVisible(true);
}
}
Clasa ColorMenu
package editor;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Hashtable;
import javax.swing.JMenu;
import javax.swing.JPanel;
import javax.swing.MenuSelectionManager;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.MatteBorder;
public class ColorMenu extends JMenu
{
protected Border m_unselectedBorder;
protected Border m_selectedBorder;
protected Border m_activeBorder;
protected Hashtable m_panes;
protected ColorPane m_selected;
public ColorMenu(String name) {
super(name);
m_unselectedBorder = new CompoundBorder(
new MatteBorder(1, 1, 1, 1, getBackground()),
new BevelBorder(BevelBorder.LOWERED,
Color.white, Color.gray));
m_selectedBorder = new CompoundBorder(
new MatteBorder(2, 2, 2, 2, Color.red),
new MatteBorder(1, 1, 1, 1, getBackground()));
m_activeBorder = new CompoundBorder(
new MatteBorder(2, 2, 2, 2, Color.blue),
new MatteBorder(1, 1, 1, 1, getBackground()));
JPanel p = new JPanel();
p.setBorder(new EmptyBorder(5, 5, 5, 5));
p.setLayout(new GridLayout(8, 8));
m_panes = new Hashtable();
int[] values = new int[] { 0, 128, 192, 255 };
for (int r=0; r<values.length; r++) {
for (int g=0; g<values.length; g++) {
for (int b=0; b<values.length; b++) {
Color c = new Color(values[r], values[g], values[b]);
ColorPane pn = new ColorPane(c);
p.add(pn);
m_panes.put(c, pn);
}
}
}
add(p);
}
public void setColor(Color c) {
Object obj = m_panes.get(c);
if (obj == null)
return;
if (m_selected != null)
m_selected.setSelected(false);
m_selected = (ColorPane)obj;
m_selected.setSelected(true);
}
public Color getColor() {
if (m_selected == null)
return null;
return m_selected.getColor();
}
public void doSelection() {
fireActionPerformed(new ActionEvent(this,
ActionEvent.ACTION_PERFORMED, getActionCommand()));
}
class ColorPane extends JPanel implements MouseListener
{
protected Color m_c;
protected boolean m_selected;
public ColorPane(Color c) {
m_c = c;
setBackground(c);
setBorder(m_unselectedBorder);
String msg = "R "+c.getRed()+", G "+c.getGreen()+
", B "+c.getBlue();
setToolTipText(msg);
addMouseListener(this);
}
public Color getColor() { return m_c; }
public Dimension getPreferredSize() {
return new Dimension(15, 15);
}
public Dimension getMaximumSize() { return getPreferredSize(); }
public Dimension getMinimumSize() { return getPreferredSize(); }
public void setSelected(boolean selected) {
m_selected = selected;
if (m_selected)
setBorder(m_selectedBorder);
else
setBorder(m_unselectedBorder);
}
public boolean isSelected() { return m_selected; }
public void mousePressed(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {
setColor(m_c);
MenuSelectionManager.defaultManager().clearSelectedPath();
doSelection();
}
public void mouseEntered(MouseEvent e) {
setBorder(m_activeBorder);
}
public void mouseExited(MouseEvent e) {
setBorder(m_selected ? m_selectedBorder :
m_unselectedBorder);
}
}
Clasa Editor
package editor;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
import javax.swing.text.rtf.RTFEditorKit;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;
import javax.swing.undo.UndoManager;
import javax.swing.undo.UndoableEdit;
public class Editor extends JFrame
{
protected JTextPane m_monitor;
protected StyleContext m_context;
protected DefaultStyledDocument m_doc;
protected RTFEditorKit m_kit;
protected JFileChooser m_chooser;
protected SimpleFilter m_rtfFilter;
protected JToolBar m_toolBar;
protected JComboBox m_cbFonts;
protected JComboBox m_cbSizes;
protected SmallToggleButton m_bBold;
protected SmallToggleButton m_bItalic;
protected String m_fontName = "";
protected int m_fontSize = 0;
protected boolean m_skipUpdate;
protected int m_xStart = -1;
protected int m_xFinish = -1;
//fonts and imaging
protected SimpleFilter m_jpgFilter;
protected SimpleFilter m_gifFilter;
protected ColorMenu m_foreground;
protected ColorMenu m_background;
protected JComboBox m_cbStyles;
protected UndoManager m_undo = new UndoManager();
protected Action m_undoAction;
protected Action m_redoAction;
public Editor() {
super("RTF Word Processor");
setSize(600, 400);
// Make sure we install the editor kit before creating
// the initial document.
m_monitor = new JTextPane();
m_kit = new RTFEditorKit();
m_monitor.setEditorKit(m_kit);
m_context = new StyleContext();
m_doc = new DefaultStyledDocument(m_context);
m_monitor.setDocument(m_doc);
JScrollPane ps = new JScrollPane(m_monitor);
getContentPane().add(ps, BorderLayout.CENTER);
JMenuBar menuBar = createMenuBar();
setJMenuBar(menuBar);
m_chooser = new JFileChooser();
m_chooser.setCurrentDirectory(new File("."));
m_rtfFilter = new SimpleFilter("rtf", "RTF Documents");
m_chooser.setFileFilter(m_rtfFilter);
m_gifFilter = new SimpleFilter("gif", "GIF images");
m_jpgFilter = new SimpleFilter("jpg", "JPG images");
CaretListener lst = new CaretListener() {
public void caretUpdate(CaretEvent e) {
showAttributes(e.getDot());
}
};
m_monitor.addCaretListener(lst);
FocusListener flst = new FocusListener() {
public void focusGained(FocusEvent e) {
if (m_xStart>=0 && m_xFinish>=0)
if (m_monitor.getCaretPosition()==m_xStart) {
m_monitor.setCaretPosition(m_xFinish);
m_monitor.moveCaretPosition(m_xStart);
}
else
m_monitor.select(m_xStart, m_xFinish);
}
public void focusLost(FocusEvent e) {
m_xStart = m_monitor.getSelectionStart();
m_xFinish = m_monitor.getSelectionEnd();
}
};
m_monitor.addFocusListener(flst);
WindowListener wndCloser = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
addWindowListener(wndCloser);
showAttributes(0);
showStyles();
m_doc.addUndoableEditListener(new Undoer());
setVisible(true);
}
protected JMenuBar createMenuBar() {
JMenuBar menuBar = new JMenuBar();
JMenu mFile = new JMenu("File");
mFile.setMnemonic('f');
ImageIcon iconNew = new ImageIcon("file_new.gif");
Action actionNew = new AbstractAction("New", iconNew) {
public void actionPerformed(ActionEvent e) {
m_doc = new DefaultStyledDocument(m_context);
m_monitor.setDocument(m_doc);
showAttributes(0);
showStyles();
m_doc.addUndoableEditListener(new Undoer());
}
};
JMenuItem item = mFile.add(actionNew);
item.setMnemonic('n');
ImageIcon iconOpen = new ImageIcon("file_open.gif");
Action actionOpen = new AbstractAction("Open…", iconOpen) {
public void actionPerformed(ActionEvent e) {
Editor.this.setCursor(
Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Thread runner = new Thread() {
public void run() {
if (m_chooser.showOpenDialog(Editor.this) !=
JFileChooser.APPROVE_OPTION)
return;
Editor.this.repaint();
File fChoosen = m_chooser.getSelectedFile();
// Recall that text component read/write operations are
// thread safe. Its ok to do this in a separate thread.
try {
InputStream in = new FileInputStream(fChoosen);
m_doc = new DefaultStyledDocument(m_context);
m_kit.read(in, m_doc, 0);
m_monitor.setDocument(m_doc);
in.close();
}
catch (Exception ex) {
ex.printStackTrace();
}
Editor.this.setCursor(Cursor.getPredefinedCursor(
Cursor.DEFAULT_CURSOR));
}
};
runner.start();
showAttributes(0);
showStyles();
m_doc.addUndoableEditListener(new Undoer());
}
};
item = mFile.add(actionOpen);
item.setMnemonic('o');
ImageIcon iconSave = new ImageIcon("file_save.gif");
Action actionSave = new AbstractAction("Save…", iconSave) {
public void actionPerformed(ActionEvent e) {
Editor.this.setCursor(
Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Thread runner = new Thread() {
public void run() {
if (m_chooser.showSaveDialog(Editor.this) !=
JFileChooser.APPROVE_OPTION)
return;
Editor.this.repaint();
File fChoosen = m_chooser.getSelectedFile();
// Recall that text component read/write operations are
// thread safe. Its ok to do this in a separate thread.
try {
OutputStream out = new FileOutputStream(fChoosen);
m_kit.write(out, m_doc, 0, m_doc.getLength());
out.close();
}
catch (Exception ex) {
ex.printStackTrace();
}
// Make sure chooser is updated to reflect new file
m_chooser.rescanCurrentDirectory();
Editor.this.setCursor(Cursor.getPredefinedCursor(
Cursor.DEFAULT_CURSOR));
}
};
runner.start();
}
};
item = mFile.add(actionSave);
item.setMnemonic('s');
mFile.addSeparator();
Action actionExit = new AbstractAction("Exit") {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
};
item = mFile.add(actionExit);
item.setMnemonic('x');
menuBar.add(mFile);
m_toolBar = new JToolBar();
JButton bNew = new SmallButton(actionNew, "New document");
m_toolBar.add(bNew);
JButton bOpen = new SmallButton(actionOpen, "Open RTF document");
m_toolBar.add(bOpen);
JButton bSave = new SmallButton(actionSave, "Save RTF document");
m_toolBar.add(bSave);
JMenu mEdit = new JMenu("Edit");
mEdit.setMnemonic('e');
Action action = new AbstractAction("Copy",
new ImageIcon("edit_copy.gif"))
{
public void actionPerformed(ActionEvent e) {
m_monitor.copy();
}
};
item = mEdit.add(action);
item.setMnemonic('c');
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,
KeyEvent.CTRL_MASK));
action = new AbstractAction("Cut",
new ImageIcon("edit_cut.gif"))
{
public void actionPerformed(ActionEvent e) {
m_monitor.cut();
}
};
item = mEdit.add(action);
item.setMnemonic('t');
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
KeyEvent.CTRL_MASK));
action = new AbstractAction("Paste",
new ImageIcon("edit_paste.gif"))
{
public void actionPerformed(ActionEvent e) {
m_monitor.paste();
}
};
item = mEdit.add(action);
item.setMnemonic('p');
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,
KeyEvent.CTRL_MASK));
mEdit.addSeparator();
m_undoAction = new AbstractAction("Undo",
new ImageIcon("edit_undo.gif"))
{
public void actionPerformed(ActionEvent e) {
try {
m_undo.undo();
}
catch (CannotUndoException ex) {
System.err.println("Unable to undo: " + ex);
}
updateUndo();
}
};
item = mEdit.add(m_undoAction);
item.setMnemonic('u');
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,
KeyEvent.CTRL_MASK));
m_redoAction = new AbstractAction("Redo",
new ImageIcon("edit_redo.gif"))
{
public void actionPerformed(ActionEvent e) {
try {
m_undo.redo();
}
catch (CannotRedoException ex) {
System.err.println("Unable to redo: " + ex);
}
updateUndo();
}
};
item = mEdit.add(m_redoAction);
item.setMnemonic('r');
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y,
KeyEvent.CTRL_MASK));
menuBar.add(mEdit);
GraphicsEnvironment ge = GraphicsEnvironment.
getLocalGraphicsEnvironment();
String[] fontNames = ge.getAvailableFontFamilyNames();
m_toolBar.addSeparator();
m_cbFonts = new JComboBox(fontNames);
m_cbFonts.setMaximumSize(m_cbFonts.getPreferredSize());
m_cbFonts.setEditable(true);
ActionListener lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
m_fontName = m_cbFonts.getSelectedItem().toString();
MutableAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setFontFamily(attr, m_fontName);
setAttributeSet(attr);
m_monitor.grabFocus();
}
};
m_cbFonts.addActionListener(lst);
m_toolBar.add(m_cbFonts);
m_toolBar.addSeparator();
m_cbSizes = new JComboBox(new String[] {"8", "9", "10",
"11", "12", "14", "16", "18", "20", "22", "24", "26",
"28", "36", "48", "72"});
m_cbSizes.setMaximumSize(m_cbSizes.getPreferredSize());
m_cbSizes.setEditable(true);
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
int fontSize = 0;
try {
fontSize = Integer.parseInt(m_cbSizes.
getSelectedItem().toString());
}
catch (NumberFormatException ex) { return; }
m_fontSize = fontSize;
MutableAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setFontSize(attr, fontSize);
setAttributeSet(attr);
m_monitor.grabFocus();
}
};
m_cbSizes.addActionListener(lst);
m_toolBar.add(m_cbSizes);
m_toolBar.addSeparator();
ImageIcon img1 = new ImageIcon("font_bold1.gif");
ImageIcon img2 = new ImageIcon("font_bold2.gif");
m_bBold = new SmallToggleButton(false, img1, img2,
"Bold font");
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
MutableAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setBold(attr, m_bBold.isSelected());
setAttributeSet(attr);
m_monitor.grabFocus();
}
};
m_bBold.addActionListener(lst);
m_toolBar.add(m_bBold);
img1 = new ImageIcon("font_italic1.gif");
img2 = new ImageIcon("font_italic2.gif");
m_bItalic = new SmallToggleButton(false, img1, img2,
"Italic font");
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
MutableAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setItalic(attr, m_bItalic.isSelected());
setAttributeSet(attr);
m_monitor.grabFocus();
}
};
m_bItalic.addActionListener(lst);
m_toolBar.add(m_bItalic);
JMenu mFormat = new JMenu("Format");
mFormat.setMnemonic('o');
JMenu mStyle = new JMenu("Style");
mStyle.setMnemonic('s');
mFormat.add(mStyle);
item = new JMenuItem("Update");
item.setMnemonic('u');
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
String name = (String)m_cbStyles.getSelectedItem();
Style style = m_doc.getStyle(name);
int p = m_monitor.getCaretPosition();
AttributeSet a = m_doc.getCharacterElement(p).
getAttributes();
style.addAttributes(a);
m_monitor.repaint();
}
};
item.addActionListener(lst);
mStyle.add(item);
item = new JMenuItem("Reapply");
item.setMnemonic('r');
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
String name = (String)m_cbStyles.getSelectedItem();
Style style = m_doc.getStyle(name);
setAttributeSet(style);
}
};
item.addActionListener(lst);
mStyle.add(item);
mFormat.addSeparator();
m_foreground = new ColorMenu("Foreground");
m_foreground.setColor(m_monitor.getForeground());
m_foreground.setMnemonic('f');
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
MutableAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setForeground(attr, m_foreground.getColor());
setAttributeSet(attr);
}
};
m_foreground.addActionListener(lst);
mFormat.add(m_foreground);
MenuListener ml = new MenuListener() {
public void menuSelected(MenuEvent e) {
int p = m_monitor.getCaretPosition();
AttributeSet a = m_doc.getCharacterElement(p).
getAttributes();
Color c = StyleConstants.getForeground(a);
m_foreground.setColor(c);
}
public void menuDeselected(MenuEvent e) {}
public void menuCanceled(MenuEvent e) {}
};
m_foreground.addMenuListener(ml);
// Bug Alert! JEditorPane background color
// doesn't work as of Java 2 FCS.
m_background = new ColorMenu("Background");
m_background.setColor(m_monitor.getBackground());
m_background.setMnemonic('b');
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
MutableAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setBackground(attr, m_background.getColor());
setAttributeSet(attr);
}
};
m_background.addActionListener(lst);
mFormat.add(m_background);
ml = new MenuListener() {
public void menuSelected(MenuEvent e) {
int p = m_monitor.getCaretPosition();
AttributeSet a = m_doc.getCharacterElement(p).
getAttributes();
Color c = StyleConstants.getBackground(a);
m_background.setColor(c);
}
public void menuDeselected(MenuEvent e) {}
public void menuCanceled(MenuEvent e) {}
};
m_background.addMenuListener(ml);
// Bug Alert! Images do not get saved.
mFormat.addSeparator();
item = new JMenuItem("Insert Image");
item.setMnemonic('i');
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
m_chooser.addChoosableFileFilter(m_gifFilter);
m_chooser.addChoosableFileFilter(m_jpgFilter);
m_chooser.setFileFilter(m_gifFilter);
m_chooser.removeChoosableFileFilter(m_rtfFilter);
Thread runner = new Thread() {
public void run() {
if (m_chooser.showOpenDialog(Editor.this) !=
JFileChooser.APPROVE_OPTION)
return;
Editor.this.repaint();
File fChoosen = m_chooser.getSelectedFile();
ImageIcon icon = new ImageIcon(fChoosen.getPath());
int w = icon.getIconWidth();
int h = icon.getIconHeight();
if (w<=0 || h<=0) {
JOptionPane.showMessageDialog(Editor.this,
"Error reading image file\n"+
fChoosen.getPath(), "Warning",
JOptionPane.WARNING_MESSAGE);
return;
}
MutableAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setIcon(attr, icon);
int p = m_monitor.getCaretPosition();
try {
m_doc.insertString(p, " ", attr);
}
catch (BadLocationException ex) {}
// Its ok to do this outside of the event-dispatching
// thread because the chooser is not visible here.
m_chooser.addChoosableFileFilter(m_rtfFilter);
m_chooser.setFileFilter(m_rtfFilter);
m_chooser.removeChoosableFileFilter(m_gifFilter);
m_chooser.removeChoosableFileFilter(m_jpgFilter);
}
};
runner.start();
}
};
item.addActionListener(lst);
mFormat.add(item);
menuBar.add(mFormat);
m_toolBar.addSeparator();
m_cbStyles = new JComboBox();
m_cbStyles.setSize(80, 15);
// m_cbStyles.setMaximumSize((m_cbStyles.getPreferredSize(). 30));
m_cbStyles.setEditable(true);
m_toolBar.add(m_cbStyles);
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (m_skipUpdate || m_cbStyles.getItemCount()==0)
return;
String name = (String)m_cbStyles.getSelectedItem();
int index = m_cbStyles.getSelectedIndex();
int p = m_monitor.getCaretPosition();
// New name entered
if (index == -1) {
m_cbStyles.addItem(name);
Style style = m_doc.addStyle(name, null);
AttributeSet a = m_doc.getCharacterElement(p).
getAttributes();
style.addAttributes(a);
return;
}
// Apply the selected style
Style currStyle = m_doc.getLogicalStyle(p);
if (!currStyle.getName().equals(name)) {
Style style = m_doc.getStyle(name);
setAttributeSet(style);
}
}
};
m_cbStyles.addActionListener(lst);
getContentPane().add(m_toolBar, BorderLayout.NORTH);
return menuBar;
}
protected void showAttributes(int p) {
m_skipUpdate = true;
AttributeSet a = m_doc.getCharacterElement(p).
getAttributes();
String name = StyleConstants.getFontFamily(a);
if (!m_fontName.equals(name)) {
m_fontName = name;
m_cbFonts.setSelectedItem(name);
}
int size = StyleConstants.getFontSize(a);
if (m_fontSize != size) {
m_fontSize = size;
m_cbSizes.setSelectedItem(Integer.toString(m_fontSize));
}
boolean bold = StyleConstants.isBold(a);
if (bold != m_bBold.isSelected())
m_bBold.setSelected(bold);
boolean italic = StyleConstants.isItalic(a);
if (italic != m_bItalic.isSelected())
m_bItalic.setSelected(italic);
Style style = m_doc.getLogicalStyle(p);
name = style.getName();
m_cbStyles.setSelectedItem(name);
m_skipUpdate = false;
}
protected void setAttributeSet(AttributeSet attr) {
if (m_skipUpdate)
return;
int xStart = m_monitor.getSelectionStart();
int xFinish = m_monitor.getSelectionEnd();
if (!m_monitor.hasFocus()) {
xStart = m_xStart;
xFinish = m_xFinish;
}
if (xStart != xFinish) {
m_doc.setCharacterAttributes(xStart, xFinish – xStart,
attr, false);
}
else {
MutableAttributeSet inputAttributes =
m_kit.getInputAttributes();
inputAttributes.addAttributes(attr);
}
}
protected void showStyles() {
m_skipUpdate = true;
if (m_cbStyles.getItemCount() > 0)
m_cbStyles.removeAllItems();
Enumeration en = m_doc.getStyleNames();
while (en.hasMoreElements()) {
String str = en.nextElement().toString();
m_cbStyles.addItem(str);
}
m_skipUpdate = false;
}
protected void updateUndo() {
if(m_undo.canUndo()) {
m_undoAction.setEnabled(true);
m_undoAction.putValue(Action.NAME,
m_undo.getUndoPresentationName());
}
else {
m_undoAction.setEnabled(false);
m_undoAction.putValue(Action.NAME, "Undo");
}
if(m_undo.canRedo()) {
m_redoAction.setEnabled(true);
m_redoAction.putValue(Action.NAME,
m_undo.getRedoPresentationName());
}
else {
m_redoAction.setEnabled(false);
m_redoAction.putValue(Action.NAME, "Redo");
}
}
public static void main(String argv[]) {
new Editor();
}
class Undoer implements UndoableEditListener
{
public Undoer() {
m_undo.die();
updateUndo();
}
public void undoableEditHappened(UndoableEditEvent e) {
UndoableEdit edit = e.getEdit();
m_undo.addEdit(e.getEdit());
updateUndo();
}
}
Clasa SimpleFilter
package editor;
import java.io.File;
public class SimpleFilter extends javax.swing.filechooser.FileFilter
{
private String m_description = null;
private String m_extension = null;
public SimpleFilter(String extension, String description) {
m_description = description;
m_extension = "." + extension.toLowerCase();
}
public String getDescription() {
return m_description;
}
public boolean accept(File f) {
if (f == null)
return false;
if (f.isDirectory())
return true;
return f.getName().toLowerCase().endsWith(m_extension);
}
}
Clasa SmallButton
package editor;
import java.awt.Insets;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
public class SmallButton extends JButton implements MouseListener
{
protected Border m_raised;
protected Border m_lowered;
protected Border m_inactive;
public SmallButton(Action act, String tip) {
super((Icon)act.getValue(Action.SMALL_ICON));
m_raised = new BevelBorder(BevelBorder.RAISED);
m_lowered = new BevelBorder(BevelBorder.LOWERED);
m_inactive = new EmptyBorder(2, 2, 2, 2);
setBorder(m_inactive);
setMargin(new Insets(1,1,1,1));
setToolTipText(tip);
addActionListener(act);
addMouseListener(this);
setRequestFocusEnabled(false);
}
public float getAlignmentY() { return 0.5f; }
public void mousePressed(MouseEvent e) {
setBorder(m_lowered);
}
public void mouseReleased(MouseEvent e) {
setBorder(m_inactive);
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {
setBorder(m_raised);
}
public void mouseExited(MouseEvent e) {
setBorder(m_inactive);
}
Clasa SmallToggleButton
package editor;
import java.awt.Insets;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.ImageIcon;
import javax.swing.JToggleButton;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
public class SmallToggleButton extends JToggleButton
implements ItemListener
{
protected Border m_raised;
protected Border m_lowered;
public SmallToggleButton(boolean selected,
ImageIcon imgUnselected, ImageIcon imgSelected, String tip) {
super(imgUnselected, selected);
setHorizontalAlignment(CENTER);
setBorderPainted(true);
m_raised = new BevelBorder(BevelBorder.RAISED);
m_lowered = new BevelBorder(BevelBorder.LOWERED);
setBorder(selected ? m_lowered : m_raised);
setMargin(new Insets(1,1,1,1));
setToolTipText(tip);
setRequestFocusEnabled(false);
setSelectedIcon(imgSelected);
addItemListener(this);
}
public float getAlignmentY() { return 0.5f; }
public void itemStateChanged(ItemEvent e) {
setBorder(isSelected() ? m_lowered : m_raised);
}
}
Clasa Font:
Clasa FontWindow
package font;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GraphicsConfiguration;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import font.controller.YaniaFont;
public class FontWindow extends JDialog {
private Font font = null;
public FontWindow(JFrame frame,Font font) throws HeadlessException {
super(frame,true);
if (font == null) {
font = new Font("Tahoma", Font.BOLD, 22);
}
getContentPane().add(new YFontChooser(font),BorderLayout.NORTH);
getContentPane().add(makeBottomPannel(),BorderLayout.CENTER);
setSize(500,300);
setResizable(false);
setVisible(true);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}
public JPanel makeBottomPannel(){
JPanel jp = new JPanel();
JButton okButton = new JButton("Apply");
JLabel okButtons = new JLabel(" ");
JButton cancelButton = new JButton("Cancel");
okButtons.setEnabled(false);
jp.add(okButton);
jp.add(okButtons);
jp.add(cancelButton);
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
font = YaniaFont.getInstance().getFont();
disposeWindow();
}
});
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
font = null;
disposeWindow();
}
});
return jp;
}
protected void disposeWindow() {
this.dispose();
}
public Font getSelectedFont(){
return font;
}
public static void main(String[] args) {
Font font = new Font("Tahoma", Font.BOLD, 22);
//new FontWindow(font);
}
}
CD / DVD
Index
B
Bibliografie 9
C
CUPRINSUL xi
D
Dimensiuni 3
F
Figuri 4
Formulele matematice 4
I
Ilustrațiile 4
L
Legenda 6
LISTA FIGURILOR xii
LISTA TABELELOR xiii
R
Referințe web 10
S
Structura documentului 2
T
Tabele 5
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Mediu Interactiv Pentru Generarea Documentelor Pdf (ID: 162766)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
