[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 452.   XSL-FO: introduzione e preparazione degli strumenti

XSL-FO (XSL formatting object) è un linguaggio realizzato in forma di file XML, con il quale si definisce l'aspetto finale di un documento. In pratica assomiglia concettualmente a HTML o a XHTML, con la differenza che vengono specificati in modo abbastanza preciso i dettagli sulla sua impaginazione per la stampa e generalmente sul suo aspetto finale.

XSL-FO nasce per essere utilizzato prevalentemente nell'ambito di un foglio di stile XSLT, con il quale si definisce la trasformazione di un documento XML in un file XSL-FO. Teoricamente, un navigatore dovrebbe essere in grado di utilizzare direttamente un foglio di stile XSLT che definisce questo tipo di trasformazione; in pratica, inizialmente si esegue la trasformazione per ottenere un file XSL-FO, che poi viene convertito in un formato finale comune (di solito è il formato PDF).

Figura 452.1. Passaggi normali per l'utilizzo di XSL-FO.

passaggi normali per l'utilizzo di XSL-FO

In questo capitolo vengono mostrati prevalentemente esempi di file scritti secondo il formato XSL-FO, senza usare un foglio di stile XSLT, utilizzando FOP come programma per l'elaborazione, allo scopo di produrre il formato finale per la stampa.

452.1   Preparazione degli strumenti

Per poter ottenere la composizione finale di un file in formato XSL-FO occorre un elaboratore FO che generi un altro file più adatto alla consultazione e alla stampa. Qui viene mostrato l'uso di FOP, (1) che assieme a Xalan fa parte del progetto XML di Apache.

A differenza di Xalan, FOP è disponibile solo come programma Java, da interpretare anche una volta compilato. Gli esempi mostrati in questo capitolo sono stati verificati con FOP, eseguito attraverso Kaffe (il linguaggio Java e l'uso di Kaffe in particolare è descritto nella parte lxxxviii).

Una volta installato FOP in un sistema GNU, dovrebbe essere disponibile uno script che consente di avviare il programma senza difficoltà:

fop [opzioni] [-fo|-xml] file_ingresso [-xsl file_xsl] \
  \[-pdf|-txt|-altro_formato] file_uscita

Se non fosse disponibile questo script, lo si potrebbe riprodurre facilmente utilizzando un contenuto simile a quello seguente:

#!/bin/sh
FOPPATH="/usr/share/java/fop.jar"
FOPPATH="$FOPPATH:/usr/share/java/xalan2.jar"
FOPPATH="$FOPPATH:/usr/share/java/xerces.jar"
FOPPATH="$FOPPATH:/usr/share/java/logkit.jar"
FOPPATH="$FOPPATH:/usr/share/java/avalon-framework.jar"
FOPPATH="$FOPPATH:/usr/share/java/batik.jar"
FOPPATH="$FOPPATH:/usr/share/java/jimi-1.0.jar"
CLASSPATH="$FOPPATH:$CLASSPATH"
export CLASSPATH

java $JAVA_OPTS org.apache.fop.apps.Fop "$@"

Come si può intendere, in questo caso si considera che i file Java di FOP e di Xalan siano contenuti nella directory /usr/share/java/; inoltre, viene considerato il contenuto della variabile di ambiente JAVA_OPTS per le opzioni da passare all'interprete Java. Infine, per quanto riguarda le prove effettuate, java è in realtà un collegamento all'eseguibile che svolge il compito di interpretazione dei programmi Java (per esempio /usr/lib/kaffe/bin/java, oppure /usr/bin/kaffe).

Per verificare subito il funzionamento di FOP si può provare con il sorgente XSL-FO seguente:

<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master master-name="prova">
            <fo:region-body />
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence master-reference="prova">
        <fo:flow flow-name="xsl-region-body">   
            <fo:block>
                Ciao a tutti.
            </fo:block>
        </fo:flow>
    </fo:page-sequence>
</fo:root>

Supponendo che si tratti del file prova.fo, si può generare la sua composizione con il comando seguente:

fop -fo prova.fo -pdf prova.pdf[invio]

Utilizzando Kaffe come interprete Java è probabile che appaiano molti errori non gravi; a parte questi, ciò che si dovrebbe vedere durante la composizione sono i messaggi seguenti:

[INFO] FOP 0.20.4
[INFO] building formatting object tree
[INFO] [1]
[INFO] Parsing of document complete, stopping renderer

Se non si arriva a vedere la frase finale in cui si conferma la conclusione dell'analisi e della composizione, qualcosa è andato storto. Quello che si deve ottenere è quindi il file prova.pdf, contenente la scritta «Ciao a tutti.», collocata a partire dall'angolo superiore sinistro del foglio, senza alcun margine (il foglio dovrebbe avere il formato Lettera, ovvero 8,5 in × 11 in).

A parte la facilità con cui è stato utilizzato FOP per questo esempio, si possono presentare problemi difficili da comprendere, perché FOP è un progetto ancora all'inizio del suo sviluppo e non genera informazioni sufficienti a trovare gli errori sintattici nel sorgente XSL-FO. Per esempio, nel momento in cui si scrive questo capitolo, se si commette un piccolo errore come quello seguente (alla quarta riga, il marcatore iniziale dell'elemento fo:simple-page-master non è concluso dal simbolo >), i messaggi di XSL-FO non aiutano a capirlo:

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
      3     <fo:layout-master-set>
      4         <fo:simple-page-master master-name="prova"
      5             <fo:region-body />
      6         </fo:simple-page-master>
      7     </fo:layout-master-set>
      8     <fo:page-sequence master-reference="prova">
      9         <fo:flow flow-name="xsl-region-body">   
     10             <fo:block>
     11                 Ciao a tutti.
     12             </fo:block>
     13         </fo:flow>
     14     </fo:page-sequence>
     15 </fo:root>

fop -fo prova.fo -pdf prova.pdf[invio]

[INFO] FOP 0.20.4
[INFO] building formatting object tree
[ERROR] Can't find bundle for base name \
  \org.apache.xerces.impl.msg.XMLMessages,locale en_US

Date le difficoltà, può essere conveniente l'abbinamento con un DTD, da verificare prima della composizione. Nel capitolo successivo (453), viene messo a disposizione un DTD completo.

Purtroppo il DTD non può verificare tutti i vincoli reali del formato XSL-FO, ma almeno consente di evitare errori grossolani.

Se si salva il file del DTD con il nome fo.dtd, nella directory corrente, si può modificare l'intestazione dei file XSL-FO nel modo seguente:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fo:root SYSTEM "fo.dtd">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
...
</fo:root>

Per l'analisi sintattica si può usare il pacchetto SP di James Clark (come descritto nel capitolo 448), ma prima occorre procurarsi anche una dichiarazione XML standard assieme al suo catalogo. Si suppone di avere così anche i file xml.dcl e xml.cat (si veda quanto spiegato nel capitolo 450), entrambi collocati nella directory corrente, assieme al DTD. Naturalmente il file xml.cat deve contenere un riferimento al file xml.dcl nella directory corrente:

SGMLDECL "xml.dcl"

Per avviare la verifica del file prova.fo che contiene la dichiarazione corretta del DTD, si può procedere con il comando seguente:

cat prova.fo | nsgmls -s -c ./xml.cat[invio]

Data questa premessa, negli esempi proposti di file XSL-FO viene inserita sempre l'intestazione che dichiara il DTD (salvo eccezioni), anche se si tratta di un'informazione superflua per la composizione.

452.2   Struttura generale del documento secondo XSL-FO

Un foglio di stile XSL-FO è un documento XML abbinato al dominio applicativo (namespace) <http://www.w3.org/1999/XSL/Format>, a cui si associa normalmente il prefisso fo:. L'elemento principale di questo documento, ovvero quello che contiene tutti gli altri, è fo:root:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fo:root SYSTEM "fo.dtd">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    ...
</fo:root>

Questo elemento contiene obbligatoriamente fo:layout-master-set e uno o più elementi fo:page-sequence. Il primo serve a descrivere la pagina e l'impaginazione generale, mentre il secondo serve a incorporare il contenuto di ciò che si vuole stampare effettivamente (il testo, le immagini, ecc.):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fo:root SYSTEM "fo.dtd">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        ...
    </fo:layout-master-set>
    <fo:page-sequence>
        ...
    </fo:page-sequence>
    ...
</fo:root>

452.3   Margini e direzione

Prima di poter descrivere la struttura della pagina secondo XSL-FO, è necessario comprendere alcuni concetti generali legati alla gestione dei margini: i «blocchi», ovvero gli oggetti che per loro natura possono essere considerati come dei rettangoli, ovvero delle scatole bidimensionali, hanno una gestione comune dei margini. Si osservi la figura 452.11.

Figura 452.11. Margini nelle scatole XSL-FO.

magini nelle scatole XSL-FO

La figura mostra due scatole con margini definiti attraverso gruppi differenti di attributi: margin-top, margin-bottom, margin-left e margin-right; space-before, space-after, start-indent e end-indent. Il primo gruppo di attributi riguarda letteralmente il margine superiore, il margine inferiore, il margine sinistro e il margine destro, mentre il secondo gruppo tiene conto della direzione della scrittura. In pratica, la figura mostra l'uso del secondo gruppo di attributi quando la scrittura avviene da sinistra a destra e dall'alto in basso; si può comprendere intuitivamente come cambino significato questi margini se l'andamento della scrittura cambia.

Questi due gruppi di definizione dei margini sono alternativi e se si usano assieme, viene scelto un tipo di margine in base a delle precedenze. Tuttavia, in generale è meglio usare il secondo gruppo di margini che è più generale.

Per quanto riguarda la direzione, questa può essere controllata con l'attributo writing-mode, a cui si possono attribuire stringhe come lr-tb e rl-tb (in questo caso riferite rispettivamente alla scrittura da sinistra a destra e dall'alto in basso, oppure da destra a sinistra e dall'alto in basso). Tuttavia, è probabile che gli strumenti di elaborazione di file XSL-FO, nel loro sviluppo iniziale, non siano in grado di adeguarsi al cambiamento di direzione.

452.4   Riferimenti

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


1) FOP   software libero con licenza speciale


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome xsl_fo_introduzione_e_preparazione_degli_strumenti.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!