Skip to topic | Skip to bottom
Home

TechWeb08
TechWeb08.GruppoLTW04Excaliburr1.9 - 07 Jul 2008 - 10:53 - DavideMalagolitopic end

Start of topic | Skip to actions

EXCALIBUR

Tipologia

Formatter PDF. Sfrutta FOP come processore XSL-FO.

Background

Non e' sempre semplice scrivere un foglio di stile XSL-FO. Ancora piu' difficile e' scriverlo in modo che sia FOP-compliant, visto che quest'ultimo ha qualche grave lacuna implementativa, anche se e' tuttora riconosciuto come il processore XSL-FO "open" piu' completo.

Per evitare di reinventare la ruota o di complicare troppo lo sviluppo di questo componente, e di rispettare al meglio gli standard attuali, si e' deciso di sfruttare delle librerie gia' esistenti, chiamate CSStToXSL-FO.

Siccome queste librerie si appoggiano su un framework chiamato Avalon per gestire la concorrenza delle chiamate e quant'altro, il nome Excalibur era d'obbligo.

Particolari implementativi

Le librerie CSSToXSLFO

Scritte in Java (e disponibili nella cartella cgi-bin/excalibur come file JAR), queste librerie definiscono una serie di classi che trasformano un documento XHTML standard in un foglio XSL-FO altrettanto standard. Se il documento XHTML e' dotato di CSS (che pero' devono essere di livello CSS 2 o superiore), questi ultimi vengono letti e le informazioni al loro interno vengono inserite nell'XSL-FO risultante. Il risultato finale e' dunque un foglio si stile XSL-FO che, se interpretato da un processore standard, produce un PDF del tutto identico alla pagina di partenza. E' disponibile, ed e' stata impiegata, un leggera estensione di queste librerie, chiamata CSS2FOP, che oltre a operare la trasformazione in XSL-FO, effettua anche la chiamata al processore FOP, nascondendo all'utilizzatore finale la fase di trasformazione ed alcuni problemi di compatibilita' con il processore FOP. Le cose quindi si sono diventate ancora piu' semplici: dato un documento XHTML dotato di CSS di livello 2 o superiore si ottiene il PDF corrispondente.

Il processo di trasformazione

Siccome le librerie richiedevano un documento XHTML standard per compiere la trasformazione, era necessario trovare un modo per generare questo file in base all'input esterno del client. Bisognava inoltre trovare una strategia per memorizzare senza rischi di concorrenza o sovrascrittura i file, senza danneggiare l'usabilita' da parte del client e rimanendo aderenti alle specifiche.

Primo passo: la generazione dell'XHTML

L'interfaccia con i client e' a cura di uno script PHP, il quale prende i dati inviati dal client compie una trasformazione XSLT per tradurre questi dati in un documento XHTML standard

Secondo passo: calcolo dell'hash

L'unico modo per non avere sovrascrittura dei file che vengono generati e' fare in modo che abbiano un nome univoco. Questo in parte contrasta con la necessita' di una cancellazione periodica. Per molti motivi sarebbe comodo che lo stesso XHTML generato finisse sempre nello stesso file, in modo evitare i duplicati. Per ottenere tutto questo si usa un algoritmo di hash (SHA1, che soffre meno di conflitti rispetto a MD5) per generare i nomi dei file. In questo modo lo stesso XHTML finira' sempre nello stesso file.

Terzo passo: restituzione dell'URL al chiamante

Siccome da specifiche un formatter PDF deve restituire un URI ed il chiamante deve accedere a quest'ultimo senza compiere ulteriori manipolazioni, viene restituito l'URI del formatter corredato di query string, in cui viene riportato il nome del documento XHTML generato. In questo modo quando il client ricontatta il server quest'ultimo sa ritrovare il documento richiesto.

Quarto passo: la generazione del PDF

Siccome la formattazione in PDF e' un processo lento, l'URI viene restituito dopo la trasformazione in XHTML, senza generare il PDF. Ora che il client comunica di nuovo col formatter, quest'ultimo recupera il nome del documento richiesto dalla query string e pensa a genrare il PDF associato, se non esiste gia'. Con una semplice direttiva exec parte di PHP viene lanciato il processore e le librerie associate. Alla fine del processo viene prodotto un file fisico contenente il PDF.

Quinto passo: restituzione dell'output al client

Impostati gli header, con la direttiva passthru viene letto il file risultante e lo stream binario contenuto viene restituito cosi' com'e' al client, che provvedera' a visualizzarlo. tutti i file generati vengono conservati, cosi' da velocizzare le richieste di documenti simili, poiche' se un file esiste gia' non viene sovrascritto (tanto per il principio dell'hashing due file che condividono lo stesso hash sono praticamente identici). Ogni tanto pero' un po' di pulizia viene comunque fatta, per problemi di quota.
to top


You are here: TechWeb08 > FieraGiugno > GruppoLTW04Excalibur

to top

Copyright © Fabio Vitali 2020 Last update of GruppoLTW04Excalibur on 07 Jul 2008 - 10:53 by DavideMalagoli