cela se fait via une transformation xsl-fo
regarde dans le projet apache les logicels fop, xalan ou encore cocoon.
sinon en php, il existe certainement des fonctions de trasnformation qui correspondent à tes attentes ...
En logiciel, il y a treebeard, mais il existe bien d'autres :
http://treebeard.sourceforge.net/