MokaCMS: Open Source per il Web Content Management

VI parte: Da XML ad PDF utilizzando XSLT e FO (prima puntata)di e

Portable Document Format (PDF) è un formato diffuso per lo scambio di documenti nel web che consente di avere lo stesso preciso layout su tutte le piattaforme. In questo articolo si vedrà come il processore XSL è in grado di creare un file in formato PDF, partendo da documenti scritti con gli oggetti di formattazione, ovvero con Formatting Objects.

Formatting Objects

XSLFO è un vocabolario xml usato per specificare un‘impaginazione e stili di testo per creare un layout di pagina. XSLFO può essere usato in congiunzione con XSLT per convertire un documento XML in un layout di pagina pronto per la stampa o per la visualizzazione.
XSLFO definisce un set di elementi in XML che descrivono come la pagina è impostata. I contenuti della pagina sono riempiti da blocchi. Ci possono essere blocchi statici che appaiono sempre nella pagina (come intestazione e piè di pagina) e il blocco principale che è racchiuso nel corpo della pagina.
Con la formattazione di oggetti è possibile definire in modo dettagliato come questi saranno visualizzati.
Ã? possibile scegliere quale tipo di carattere usare, se utilizzare un stile sottolineato piuttosto che un grassetto e cosi via. Ã? possibile posizionare interi blocchi di testo o immagini ovunque all‘interno del documento.
Gli oggetti di formattazione XSL hanno un loro namespace "http://www.w3.org/1999/XSL/Format", proprio come le altre applicazioni XML. Il prefisso utilizzato per indicare che è un elemento di formattazione è fo.
Partiamo da un semplice esempio.

Benvenuti a FOP!

Si vuole creare un blocco contente il testo "Benvenuti". Un blocco è un‘area rettangolare nel documento in uscita, quello che poi sarà  in questo caso un documento pdf.
Prima di poter creare il blocco, bisogna definire i margini della pagina, dire al processore se questa pagina possiede un‘intestazione e/o un piè di pagina ecc. Per xsl-fo la pagina è composta da cinque aree che sono: region-start, region-body, region-end, region-before e region-after. La loro rappresentazione è illustrata in figura 1.

Tutte le aree tranne la region-body sono opzionali: possono non esserci all‘interno del documento.
Si supponga che la pagina debba avere il margine superiore pari a 2,5 cm, il margine inferiore, destro e sinistro pari a 2 cm; ciò significa che il corpo della pagina, cioè la region-body, è posizionata a 2,5 cm dal bordo del foglio superiore e 2 cm dagli altri bordi, come mostrato in figura 2.

Per definire un set di pagine si utilizza l‘elemento fo:layout-master-set. I margini di una pagina, invece, sono impostati tramite fo:simple-page-master, figlio diretto dell‘elemento precedentemente citato.
All‘interno di un fo:layout-master-set ci possono essere più di un fo:simple-page-master. Questo significa che si possono creare più tipologie di pagine all‘interno dello stesso documento.

......

Nel fo:simple-page-master sono specificati gli attributi che definiscono i margini della pagina, i quali sono:

  • page-height e page-width, che definiscono rispettivamente l‘altezza e la larghezza dei foglio.
  • margin-top e margin-bottom, che definiscono la distanza tra il bordo superiore del foglio e il corpo della pagina per il primo, e la distanza tra il bordo inferiore e il corpo della pagina per il secondo.
  • margin-left e margin-right che definiscono rispettivamente la distanza tra il bordo destro del foglio e il corpo della pagina e la distanza tra il bordo sinistro e il corpo della pagina.

·

  • master-name è il nome che identifica questo elemento fo:simple-page-master.

Per comprendere meglio si guardi la figura di seguito riportata.

Fino ad ora sono stati discussi i margini della pagina. Ora è necessario dichiarare quali aree devono esserci in questo tipo di pagina. Per semplicità  ne dichiareremo solo una, la quale è region-body.
Se nella dichiarazione vi sono presenti una o più aree, è obbligatorio che queste vengano poi definite all‘interno del documento. Questo perchà© il processore non è in grado di ignorare una dichiarazione di un‘area nel momento in cui non la trova per elaborarla.

...

Nella dichiarazione della region-body sono presenti attributi gia visti nell‘elemento fo:simple-page-master.
Questi elementi danno la possibilità  di separare ulteriormente il corpo della pagina dalle altre aree oppure di far coincidere confini della region-body con i confini delle altre aree.
Si è ora pronti per scrivere il codice necessario alla costruzione del blocco che visualizzerà  il testo "Benvenuti".
Per farlo dobbiamo definire l‘area region-body dove all‘interno verra inserito l‘elemento fo:block

Benvenuti

L‘elemento fo:block è un‘area rettangolare di dimensione variabile in altezza, mentre in larghezza occupa tutto lo spazio dedicato al corpo della pagina in questo caso. Se fosse stato contenuto in una cella di una tabella, occuperebbe lo spazio dedicato alla cella.
Non è stato specificato nessun stile per questo elemento, di conseguenza il processore utilizzerà  un font di default. Nel caso in cui si voglia applicargli un font diverso da quello di default bisogna specificare gli attributi nel fo:block.

Benvenuti

Nell‘elemento fo:block si possono quindi definire i seguenti attributi:

  • font-family definisce il tipo di font.
  • font-size dichiara la grandezza del font da utilizzare.
  • font-style definisce lo stile. In questo caso abbiamo utilizzato il corsivo.
  • font-weight definisce la larghezza del font utilizzato. In questo caso è grassetto.
  • color definisce il colore del font.
  • text-align specifica l‘allineamento del testo, in questo caso il testo è stato allineato al centro.

Il risultato è il seguente:

Di seguito è riportato il codice completo per realizzare questo esempio.

Benvenuti 

Formattiamo un articolo

Nel paragrafo precedente si è visto come scrivere un file xslfo per produrre un qualsiasi pdf in uscita. Ora si vedrà  come scrivere un file xslfo per produrre un‘articolo di mokabyte in formato pdf.
Il codice che si andrà  a scrivere sarà  organizzato a template. Questo significa che verrà  creato un modello per ogni parte di codice che andrà  a comporre l‘articolo, e in futuro questi potranno essere riutilizzati per comporre altre tipologie di PDF per Mokabyte.
L‘organizzazione a template è molto pratica a livello di sviluppo, in quanto permette un‘individuazione dell‘errore in minor tempo. Inoltre semplifica molto la lettura del codice.
Saranno creati i seguenti template:

  • pageLayoutTemplate. Qui verranno specificate le misure, i margini della pagina, e quali aree saranno presenti. In questo caso saranno presenti la region-before, la region-after, e la region-start.
  • headerTemplate. In questo template, verrà  sviluppata l‘area comunemente chiamata intestazione.
  • footerTemplate. Qui sarà  costruito il pià© di pagina dell‘articolo.
  • bodyTemplate. Quest‘ area sarà  destinata a contenere l‘intero articolo.

Il primo template risiederà  in un file chiamato mokaBytePageLayout.xsl . I successivi tre, risiederanno in un file denominato mokaByteRegionsTemplate.xsl . Inoltre sarà  creato un file chiamato mokaByteStyles.xsl che conterrà  tutti gli stili da applicare all‘articolo. Questi verranno a loro volta inglobati nel file mokaByteArticle.xsl, il quale si preoccuperà  di creare il vero e proprio articolo chiamando i vari templates. Si partirà  scrivendo alcuni degli stili che dovranno essere applicati.
Ã? importante per una buona riuscita del lavoro, stabilire a priori le caratteristiche che un documento deve avere; è necessario per poter mantenere una linea da seguire poi successivamente.

Lo stile

Per tutto il testo sarà  utilizzato il font Helvetica di varie misure e di colore verde, tranne che per le parti di codice alle quali verrà  applicato il font Courier New di 10pt di colore nero.
Il titolo sarà  in grassetto e avrà  grandezza pari a 24pt, mentre i titoli delle sezioni saranno anch‘essi in grassetto ma di dimensione pari a 12pt.
L‘introduzione avrà  grandezza di 10pt ma sarà  scritta in corsivo, e sia l‘intestazione che il piè di pagina avranno anche loro grandezza 10pt e saranno in grassetto la prima e normale il secondo.
Per applicare un certo stile ad una parte di testo, si possono utilizzare i set di attributi, proprio come le classi di stile in CSS.
Per scrivere un set di attributi si utilizza l‘elemento xsl:attribute-set , dove al suo interno troviamo l‘elemento xsl:attribute che specifica l‘attributo CSS da usare dichiarandone anche il valore. Si prendano come esempio i set di attributi sotto riportati.

Arial24ptrgb(0,102,0)boldleftCourierNew10ptrgb(0,0,0)left

Misure e margini

Nel template che identifica e specifica i margini e le misure (pageLayoutTemplate), saranno dichiarati i seguenti valori:

fo:simple-page-master 
  • master-name="mokaBytePage"
  • page-height="29.7cm"
  • page-width="21cm"
  • margin-top="1.0cm"
  • margin-bottom="1.0cm"
  • margin-left="0.5cm"
  • margin-right="2.0cm"
fo:region-body
  • margin-top="2.5cm"
  • margin-bottom="2.0cm"
  • margin-left="4.0cm"
  • margin-right="0.0cm"
fo:region-before
  • extent="1.25cm"
fo:region-after
  • extent="1.25cm"
fo:region-start
  • extent="3.60cm"

Quest‘ultima area, è dichiarata, ma conterrà  solo un blocco (fo:block) vuoto. Si potrebbe fare a meno di quest‘ area visto che non conterrà  nulla, ma la sua presenza renderà  il lavoro più facile in quanto occupa spazio all‘interno della pagina e non verrà  discussa in seguito.
Il codice completo relativo a questo template è riportato nelle pagine successive al termine dell‘articolo.

Intestazione

L‘intestazione dovrà  riportare il testo "Mokabyte" seguito dal numero della rivista e dalla data (in formato mese anno) di pubblicazione. Lo stile da applicare è già  stato esplicato prima, e sarà  applicato usando il set di attributi identificato con il nome di "header" (al di sotto del testo dovrà  apparire una linea puramente estetica di colore verde).
A questo scopo sono state necessarie delle modifiche all‘ xml in uso. Ã? stato infatti necessario aggiungere gli elementi contenenti le informazioni come il numero della rivista e la data di pubblicazione ecc:

97Giugno2005

Per una miglior organizzazione dei dati è stato creato l‘elemento rivista, che come si può notare contiene gli elementi numero, mese e anno. Ogni qualvolta che sarà  necessario inserire nuove informazioni inerenti alla rivista e non al contenuto di essa, (per esempio in caso Mokabyte venisse stampata, il prezzo della rivista), dovrà  essere creato un elemento apposito che contenga l‘informazione, e quest‘ ultimo deve far parte dell‘elemento rivista.

MokaByte  -  

Introduciamo ora un elemento di cui non si è ancora discusso fo:leader. Questo elemento è utilizzato per "disegnare" righe di diverse altezze e lunghezze, a anche di tipo diverso. Tramite l‘attributo leader-pattern specifica il tipo di linea, infatti questo può assumere il valore "rule" che indica una linea continua, oppure può assumere il valore "dots" che indica linea composta da una serie di puntini oppure "space" che disegna una linea di spazi. In genere l‘elemento fo:leader è usato per costruire i sommari e gli indici.
Il risultato è mostrato in figura 5.

Conclusioni

In questa prima parte abbiamo visto come iniziare a sviluppare con fop ed abbiamo cominciato a sviluppare un foglio di stile per gli articoli di Mokabyte definendone la struttura e le caratteristiche generali. Nel prossimo numero termineremo il lavoro concludendo lo sviluppo dell‘xsl di formattazione.

Condividi

Pubblicato nel numero
98 luglio 2005
Massimiliano Bigatti è sviluppatore senior, autore tecnico e appassionato di fotografia. Certificato, tra le altre, come SUN Certified Enterprise Architect for Java2 Enterprise Edition Technology, lavora presso un importante business solution provider. Nel tempo libero scrive per diverse riviste di informatica e ha scritto una decina di libri, quasi tutti…
Articoli nella stessa serie
Ti potrebbe interessare anche